LoadInst 和 AllocaInst 的初始化不起作用

问题描述

我目前正在尝试制作自己的 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 (将#修改为@)