c – 如何将可变数量的参数传递给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);

但是,如果我现在调用选择:

foo@foo-Ubuntu:~/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将接受最多2个位置参数.

我究竟做错了什么?

解决方法:

我认为问题是opt已经在解析自己的参数,并且已经将bitcode文件作为位置参数进行处理,因此具有多个位置参数会产生歧义.

该文档解释了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 :: OneOrMore of Files2选项到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参数选项,并执行以下操作:

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
上一篇:c – 成功构建iOS后没有libclang.a?


下一篇:在另一台机器上运行从clang llvm编译的程序