2017-04-20 2 views
3

Ich möchte eine variable Anzahl von Argumenten zu meinem LLVM opt pass übergeben.Wie übergebe ich eine variable Anzahl von Argumenten an einen LLVM-Opt-Pass?

Um dies zu tun, das tue ich so etwas wie:

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

Wenn ich aber wie rufe jetzt opt:

[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 

, dann Fehler, die ich erhalten, die höchstens zwei Positionsargumente akzeptieren entscheiden .

Was mache ich falsch?

+0

Das S-Flag ist keine Option für den Pass, es ist eine Option, sich selbst zu aktivieren, so dass es die LLVM-Assembly ausgibt. – Shuzheng

+0

Wie kann ich die erste Arbeit (Positional) machen? – Shuzheng

+0

Können Sie die Option '-mapiWM' erklären? – hailinzeng

Antwort

3

Ich denke, das Problem ist, dass opt bereits seine eigenen Argumente analysiert, und hat bereits die Bitcode-Datei als Positionsargument zu verarbeiten, so dass mehr als eine Positionsargumente Ambiguität schafft.

Die Dokumentation erläutert die API so, als ob sie in einer eigenständigen Anwendung verwendet wird. So zum Beispiel, wenn Sie so etwas tun:

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"; 
} 

Sie so etwas wie dieses:

$ foo -l one two three four five six 

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

Nun, wenn Sie sich um die beiden Positions Argument Definitionen tauschen oder sogar die cl::OneOrMore von ändern Files2 Option cl::ZeroOrMore, erhalten Sie einen Fehler

$ 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! 

persönlich bekommen, wenn ich opt verwenden verzichten wir die positiontal arg UMENT Option und etwas tun, wie folgt aus:

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

, die mich, dies zu tun erlaubt:

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

und Iterieren über die std::string Liste die gleiche Art und Weise erhalte ich:

one 
two 
+0

Danke, Alter! Als letzte Frage, bevor ich Ihre Antwort als akzeptiert markieren: Wissen Sie, wie Sie die Optionsbeschreibungen für einen auf dem Terminal ausgegebenen Ausweis sehen? Wie sage ich 'opt', um z. B.' cl :: desc ("Namen angeben") für meinen Pass anzugeben? – Shuzheng

+0

nicht "help" das für Sie tun? wie gesagt [hier] (http://llvm.org/docs/CommandLine.html#cl-desc) – compor

+0

Nein, es listet nur das Hilfemenü für 'opt' auf - nicht den Pass selbst. – Shuzheng

2

Als @ compor schlägt vor, dass dies wahrscheinlich etwas mit Verflechtungsargumenten für opt und Ihrem eigenen Pass zu tun hat. Die CommandLine-Bibliothek wird hauptsächlich für eigenständige Anwendungen im LLVM-Framework geschrieben.

Sie können jedoch, wie etwas tun:

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

Dies hat den Vorteil, dass Sie eingeben können mehrere Argumente auf der Kommandozeile entweder Komma, beispielsweise arg1,arg2,... oder durch die Kennung -args1 arg1 arg2 ... verwendet wird; und diese werden in die Args1 Liste eingefügt. Wenn Sie nur ein einzelnes Positionsargument arg in der Befehlszeile angeben, enthält Args1 nur dieses Argument.

Sie können auch angeben, -args2 arg in der Befehlszeile, wo immer Sie mit (namens nicht-positionale Option). Diese werden in die Args2 Liste aufgenommen.

Verwandte Themen