我在一个函数上写了一个包装器,我想内联它(这个包装器只是以另一种方式映射原始函数的参数)。
我试图在更改后通过我的模块调用 llvm 中的内联程序,但它没有完成工作,尽管我尝试从 opt 工具调用 pass 并且它有效,知道可能有什么问题吗?
这是我如何调用内联 channel :
llvm::PassManager my_passes;
my_passes.add(llvm::createFunctionInliningPass(4096));
my_passes.run(module);
最佳答案
我设法让“AlwaysInline”通行证工作。这些步骤很像你描述的:
llvm::Module m("MyJIT", llvm::getGlobalContext());
llvm::PassManager pm;
pm.add(llvm::createAlwaysInlinerPass());
...
llvm::Function* f = buildMyFunction();
f->addAttribute(llvm::AttributeSet::FunctionIndex, llvm::Attribute::AlwaysInline);
...
llvm::DebugFlag = true;
pm.runOnModule(m);
m.dump();
注意 llvm::DebugFlag 变量,这将导致 llvm 代码生成机制产生大量的诊断输出。它在
llvm/Support/Debug.h
中声明并且可以从您的代码或通过 set llvm::DebugFlag = 1
从 gdb 进行更改.还可以尝试查看 llvm 源代码;相关位将在
${llvm_root_dir}/lib/Transforms/IPO/Inliner.cpp
关于llvm 内联 channel 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15766194/