问题描述
我目前正在尝试制作自己的 JIT 语言来了解该主题。我的工作基于 lsegal 和drifter1 找到的两个资源。
现在我正在尝试编译 lsegal 的玩具编译器以更好地理解它。这样做时,编译器给我一个错误,告诉我我搞砸了 LoadInst 和 AllocaInst 初始化。代码如下:
new AllocaInst(typeOf(type),id.name.c_str(),context.currentBlock());
new LoadInst(context.locals()[name],"",false,context.currentBlock());
这里是 CodeGenContext 的代码:
class CodeGenBlock {
public:
BasicBlock *block;
Value *returnValue;
std::map<std::string,Value*> locals;
};
class CodeGenContext {
std::stack<CodeGenBlock *> blocks;
Function *mainFunction;
public:
Module *module;
CodeGenContext() { module = new Module("main",MyContext); }
void generateCode(NBlock& root);
GenericValue runcode();
std::map<std::string,Value*>& locals() { return blocks.top()->locals; }
BasicBlock *currentBlock() { return blocks.top()->block; }
void pushBlock(BasicBlock *block) { blocks.push(new CodeGenBlock()); blocks.top()->returnValue = NULL; blocks.top()->block = block; }
void popBlock() { CodeGenBlock *top = blocks.top(); blocks.pop(); delete top; }
void setCurrentReturnValue(Value *value) { blocks.top()->returnValue = value; }
Value* getCurrentReturnValue() { return blocks.top()->returnValue; }
};
这是我在 LoadInst 的文档中找到的,它应该匹配:
LoadInst (Value *Ptr,const Twine &NameStr,bool isVolatile,BasicBlock *InsertAtEnd)
这是我在 AllocaInst 和这里发现的相同故事:
AllocaInst ( Type * Ty,unsigned AddrSpace,const Twine& Name,BasicBlock* InsertAtEnd )
我使用的是 llvm 版本 12.0.0 和 clang 版本 11.0.3。 我只是按原样使用 github 存储库 (github.com/lsegal/my_toy_compiler),除了我更改了第 13 和 14 行的 codegen.h 以正确包含 BitstreamWriter.h 和 BitstreamReader.h,它们位于 Bitstream 文件夹中,而不是 Bitcode
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)