我在函数上写了一个包装器,我想内联它(这个包装器只是以另一种方式映射原始函数的参数)。 我试图在我的模块之后通过我的模块调用llvm中的内联器并且它没有完成工作,虽然我尝试从opt工具调用传递并且它工作,任何想法可能是错的?
以下是我如何调用内联传递:
llvm::PassManager my_passes;
my_passes.add(llvm::createFunctionInliningPass(4096));
my_passes.run(module);
答案 0 :(得分:3)
我设法获得了#34; 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