微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

LoadInst 和 AllocaInst 的初始化不起作用

如何解决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 举报,一经查实,本站将立刻删除。