我在一个函数上写了一个包装器,我想内联它(这个包装器只是以另一种方式映射原始函数的参数)。我试图在我的更改之后通过我的模块调用 llvm 中的内联程序,但它没有完成工作,尽管我尝试从 opt 工具调用 pass 并且它有效,知道可能有什么问题吗?
这是我如何调用内联通道:
llvm::PassManager my_passes;
my_passes.add(llvm::createFunctionInliningPass(4096));
my_passes.run(module);
我在一个函数上写了一个包装器,我想内联它(这个包装器只是以另一种方式映射原始函数的参数)。我试图在我的更改之后通过我的模块调用 llvm 中的内联程序,但它没有完成工作,尽管我尝试从 opt 工具调用 pass 并且它有效,知道可能有什么问题吗?
这是我如何调用内联通道:
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
可以从您的代码或通过 gdb 更改set llvm::DebugFlag = 1
。
还可以尝试查看 llvm 源代码;相关位将在${llvm_root_dir}/lib/Transforms/IPO/Inliner.cpp