llvm 内联 channel 不起作用

标签 llvm inline llvm-c++-api

我在一个函数上写了一个包装器,我想内联它(这个包装器只是以另一种方式映射原始函数的参数)。
我试图在更改后通过我的模块调用 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/

相关文章:

c++ - llvm builder 向基本 block 添加终止符

haskell - 选择与 LLVM 一起使用的函数式编程语言时,有哪些权衡?

sql - 如果使用内联 SQL 不好,那么在实践中使用 LINQ 执行查询有何不同?

g++ - 如何摆脱g++中的 "inline function used but never defined"警告

c++ - 从 LLVM 添加到 C++ lambda 的映射

c++ - 将适当的 PHI 节点添加到 llvm-ir

ocaml - llvm OCaml 绑定(bind)

javascript - 将 Python/Boo/Ruby 类语法编译为 C/C++/LLVM/Javascript 的工具(使用 JS ArrayBuffer 提高速度)

llvm - 使用 LLVM 的控制台输出

c++ - 模板化类的方法是否隐含内联链接?