2017-04-20 138 views
3

我想將可變數量的參數傳遞給我的LLVM opt pass。如何將可變數量的參數傳遞給LLVM opt pass?

要做到這一點,我做這樣的事情:

static cl::list<std::string> Files(cl::Positional, cl::OneOrMore); 
static cl::list<std::string> Libraries("l", cl::ZeroOrMore); 

但是,如果我現在調用選擇,如:

[email protected]:~/llvm-ir-obfuscation$ opt -load cmake-build-debug/water/libMapInstWMPass.so -mapiWM programs/ll/sum100.ll -S 2 3 4 -o foo.ll 
opt: Too many positional arguments specified! 
Can specify at most 2 positional arguments: See: opt -help 

,然後我得到的是選擇將接受最多2個位置參數錯誤。

我在做什麼錯?

+0

S標誌不是傳遞的選項,它是一個選項,使其自己使其輸出LLVM程序集。 – Shuzheng

+0

我該如何做第一件作品(定位)? – Shuzheng

+0

你能解釋'-mapiWM'選項嗎? – hailinzeng

回答

3

我認爲問題在於opt已經解析了它自己的參數,並且已經將位碼文件作爲位置參數進行處理,因此具有多個位置參數會產生不明確性。

該文檔解釋了API,就像它在獨立應用程序中使用一樣。因此,舉例來說,如果你做這樣的事情:

int main(int argc, char *argv[]) { 
    cl::list<std::string> Files(cl::Positional, cl::OneOrMore); 
    cl::list<std::string> Files2(cl::Positional, cl::OneOrMore); 
    cl::list<std::string> Libraries("l", cl::ZeroOrMore); 
    cl::ParseCommandLineOptions(argc, argv); 

    for(auto &e : Libraries) outs() << e << "\n"; 
    outs() << "....\n"; 
    for(auto &e : Files) outs() << e << "\n"; 
    outs() << "....\n"; 
    for(auto &e : Files2) outs() << e << "\n"; 
    outs() << "....\n"; 
} 

你得到的東西是這樣的:

$ foo -l one two three four five six 

one 
.... 
two 
three 
four 
five 
.... 
six 
.... 

現在,如果你身邊兩個位置參數的定義交換,甚至可以改變的cl::OneOrMoreFiles2選項cl::ZeroOrMore,你會得到一個錯誤

$ option: error - option can never match, because another positional argument will match an unbounded number of values, and this option does not require a value! 

個人而言,當我使用opt我放棄了positiontal ARG ument選項,做這樣的事情:

cl::list<std::string> Lists("lists", cl::desc("Specify names"), cl::OneOrMore); 

,讓我做到這一點:

opt -load ./fooPass.so -foo -o out.bc -lists one ./in.bc -lists two 

並遍歷std::string列表以同樣的方式獲得:

one 
two 
+0

謝謝兄弟!作爲最後一個問題,在我將您的答案標記爲已接受之前:您是否知道如何查看在終端上輸出的通行證的選項描述?我如何告訴'opt'列出,例如,'cl :: desc(「指定姓名」)爲我的通行證? – Shuzheng

+0

不是'-help'爲你做的嗎?如[在此]所述(http://llvm.org/docs/CommandLine.html#cl-desc) – compor

+0

不,它只是列出了「opt」的幫助菜單 - 而不是傳遞本身。 – Shuzheng

2

正如@ compor表示,這可能與將opt和你自己的傳球交織在一起的論點有關。 CommandLine庫主要是爲LLVM框架內的獨立應用程序編寫的。

但是,可以這樣做:

static cl::list<std::string> Args1("args1", cl::Positional, cl::CommaSeparated); 
static cl::list<std::string> Args2("args2", cl::ZeroOrMore); 

這具有的優點是,可以使用任一逗號命令行,例如,arg1,arg2,...或通過使用所述識別符-args1 arg1 arg2 ...輸入多個參數;並將它們插入到Args1列表中。如果您只是在命令行上提供單個位置參數arg,則Args1將只包含此參數。

此外,您可以在命令行上指定-args2 arg,無論您身在何處(命名爲非定位選項)。這些將進入Args2列表。

相關問題