2017-04-20 9 views
3

LLVM optパスに可変数の引数を渡したいと思います。その後、私が手を選ぶの誤差は最大2つの位置引数を受け入れます、可変数の引数をLLVMオプティカルパスに渡すにはどうすればよいですか?

[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 

:私は今のようなOPTを起動する場合は、しかし、

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

:これを行うには

は、私のような何かを。

私は間違っていますか?

+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 
.... 

、次の2つの位置引数の定義の周りに入れ替える、あるいはのcl::OneOrMoreを変更した場合cl::ZeroOrMoreからFiles2オプションは、エラー

個人的に
$ 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引数を見送るを取得します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

ありがとう!最後の質問として、私があなたの答えを受け入れたものとしてマークする前に、ターミナルに出力されたパスのオプションの説明を見る方法を知っていますか?私のパスに 'cl :: desc("名前を指定する ")などのように' opt'を表示する方法を教えてください。 – Shuzheng

+0

'-help'はそれをしませんか? [ここ](http://llvm.org/docs/CommandLine.html#cl-desc) – compor

+0

いいえ、それは単に 'opt'のヘルプメニューをリストしています - パス自体ではありません。 – Shuzheng

2

ように@これはおそらくoptの引数と自分のパスを絡み合わせることと関係があるでしょう。 CommandLineライブラリは、主にLLVMフレームワーク内のスタンドアロンアプリケーション用に書かれています。

しかし、あなたのような何かを行うことができます。これは、あなたがカンマ、例えば、arg1,arg2,...または識別子-args1 arg1 arg2 ...を使用して、いずれかを使用して、コマンドライン上の入力複数の引数をすることができるという利点がある

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

を。これらはArgs1リストに挿入されます。コマンドラインで位置指定引数argを1つだけ指定すると、Args1にはこの引数だけが含まれます。

また、コマンドラインにはどこでも(非定位置オプションと呼ばれる)、-args2 argを指定できます。これらはArgs2リストに記載されています。

関連する問題