2013-04-02 56 views
4

我已經寫了一個函數封裝器,我想內聯它(這個封裝器只是以另一種方式映射原始函數的參數)。 我想在我的模塊中調用llvm中的內聯函數,並且它沒有完成這項工作,儘管我嘗試調用opt工具的傳遞並且它工作,任何想法可能是錯誤的?llvm inliner pass不起作用

這裏是我所說的襯裏通:

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

您的代碼片段對我來說看起來很好,也許會對它進行一些基本的理智檢查 - 例如在一個普通的模塊上運行一個簡單的輸入,或者在其中輸入一個不同的傳遞來查看它是否存在作品...調試它可能也是一個好主意。 – Oak

回答

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中聲明,可以通過set llvm::DebugFlag = 1從您的代碼或gdb中更改。

也可以試試看llvm源碼;相關的位將在${llvm_root_dir}/lib/Transforms/IPO/Inliner.cpp