代码之家  ›  专栏  ›  技术社区  ›  Taylor Hansen

为什么llvm::模块存储在唯一的ptr中?

  •  2
  • Taylor Hansen  · 技术社区  · 7 年前

    LLVM Kaleidoscope 在教程中,我发现了以下代码:

    static std::unique_ptr<Module> TheModule;
    

    我不明白为什么它存储在unique\u ptr中,而不是存储在常规全局变量中。也许对象太大了,所以进行堆分配而不是堆栈更有效?毕竟 sizeof(Module) 在我的系统上是728。我能得到一个不是基于猜测的具体答案吗?谢谢

    1 回复  |  直到 7 年前
        1
  •  3
  •   PaulR    7 年前

    在里面 chapter 4 TheModule 廉价地移动到JIT中(AFAIK然后在代码生成后删除),然后使用新的 Module ,这不适用于静态 单元 变量

      auto H = TheJIT->addModule(std::move(TheModule));
      InitializeModuleAndPassManager(); // here a new empty module is created
    

    虽然可以编写JIT以通过普通 单元 指向的指针 IRCompileLayer ,静态 单元 之后无法用新模块替换变量。

    本教程说:

    一旦模块被添加到JIT中,就不能再 修改了,所以我们还打开了一个新模块来保存后续代码 正在调用InitializeModuleAndPassManager()。

    static void InitializeModuleAndPassManager() {
      // Open a new module.
      TheModule = llvm::make_unique<Module>("my cool jit", TheContext);
    

    如果模块是 单元 而不是 unique_ptr<Module> 此分配将失败。