2015-04-29 106 views
1

我正在研究LLVM混淆項目。我已經寫了LLVM通(可以說流動壓扁通),這我就源(test.c的)用下面的命令運行:如何將LLVMPass long opt命令更改爲簡單的命令

clang -emit-llvm test.c -c -o test.bc 
opt -load ../../.. LLVMFlattening.so -fla <test.bc>/dev/null 

但我已經看到,在O型LLVM項目中,他們使用達到同樣的事情:

clang -emit-llvm test.c -c -o test.bc -mllvm -fla 

有人能告訴我什麼是-mllvm在這裏,以及這是如何變成一個簡單的命令?

回答

4

-mllvm表示Additional arguments to forward to LLVM's option processing。因此-mllvm -fla將通過-fla到LLVM的選項處理。

Clang和LLVM可以分開運行。如果你想讓clang運行llvm,並且還有一些你希望llvm知道的選項。 -mllvm是你需要的。

默認情況下,LLVM並未打開所有轉換通道。通過-fla,LLVM將通過調用函數RegisterPass<typename passName>打開通過命令行參數fla註冊的過程。

在您的命令行中,opt的-load選項用於加載插件。如果您想按預期使用簡單的命令行。您的通行證需要鏈接到opt二進制文件中。這可以通過以下兩種方式來完成:

  1. (不修改現有的LLVM源代碼樹):加入這個link
  2. 提到CMakeLists.txt添加您的唯一通道的源直接在通源代碼文件夾複製到<LLVM root>/lib/Transform目錄。並修改<LLVM root>/lib/Transform/CMakeLists.txt,加上add_subdirectory(<pass name>)就像其他人一樣。
+0

但他們如何用-mllvm添加-fla(流平展傳遞的標誌)。我不想用opt命令來使用我的llvmPass –

+0

llvm的加載路徑在哪裏? –

+0

對不起,我犯了一個錯誤,您的密碼可以與現有的'opt'二進制文件連接在一起,使其完成。我已經更新了我的答案。 –

0

我正在使用O-LLVM,並且遇到了同樣的問題。這裏是我的解決方案:

1.增加static cl::opt<bool> YOUR_FLA("fla", cl::init(false),"info...")PassManagerBuilder.cpp

在混淆通源代碼2.加功能Pass *createYOUR_FLA(bool flag)

3.添加MPM.add(createYOUR_FLA(YOUR_FLA));PassManagerBuilder.cpp

上述解決方案的功能populateModulePassManager與我簡單的傳球一起工作。