5

関数のラッパーを作成しましたが、それをインライン化したいです (このラッパーは元の関数の引数を別の方法でマップするだけです)。変更後に自分のモジュールで llvm のインライナーを呼び出そうとしていますが、opt ツールからパスを呼び出してみましたが、うまくいきませんでした。何が間違っているのでしょうか?

インラインパスを呼び出す方法は次のとおりです。

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 に答える