5

我在一个函数上写了一个包装器,我想内联它(这个包装器只是以另一种方式映射原始函数的参数)。我试图在我的更改之后通过我的模块调用 llvm 中的内联程序,但它没有完成工作,尽管我尝试从 opt 工具调用 pass 并且它有效,知道可能有什么问题吗?

这是我如何调用内联通道:

llvm::PassManager my_passes;
my_passes.add(llvm::createFunctionInliningPass(4096));
my_passes.run(module);
4

1 回答 1

3

我设法让“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可以从您的代码或通过 gdb 更改set llvm::DebugFlag = 1

还可以尝试查看 llvm 源代码;相关位将在${llvm_root_dir}/lib/Transforms/IPO/Inliner.cpp

于 2014-04-23T15:35:45.210 回答