如何在llvm中使用RandomNumberGenerator?

时间:2017-12-11 19:04:06

标签: llvm

我希望有人可以举例说明如何在LLVM中使用RandomNumberGenerator类。我能找到的所有例子似乎都使用了过时的方法。

我希望能够在传递中创建一个可以使用'-rng-seed'参数覆盖的RNG。

如果将该值作为参数提供,该如何访问该值,如果未将其作为参数提供,如何创建该值?

另外,我知道单个模块的线程之间不能共享单个RNG。如果我在模块上运行多次传递,他们可以共享相同的生成RNG吗?

1 个答案:

答案 0 :(得分:1)

RandomNumberGenerator类有一个私有构造函数(检查它的doc和llvm/lib/Support/RandomNumberGenerator.cpp下的源文件),所以唯一的方法(我知道,至少)获取一个实例是通过Module' createRNG方法。

所以,假设您有llvm:Function次通过(并使用C ++ 11):

bool runOnFunction(llvm::Function &CurFunc) override {
  auto rng = CurFunc.getParent()->createRNG(this);
  llvm::errs() << (*rng)() << '\n';

  return false;
}

现在你可以在这样的模块上运行它(假设你修改了documentationhello world传递):

opt -load ./libLLVMHelloPass.so -hello foo.bc -o bar.bc

重新运行它,它会给你相同的伪随机数。

包含标题后,-rng-seed选项可用于您的通行证(并链接到LLVM支持库,即llvm-config --libfiles support)。因此,将上述执行行更改为:

opt -load ./libLLVMHelloPass.so -hello -rng-seed 42 foo.bc -o bar.bc

应该给出不同的顺序。

最后,AFAIK,LLVM通过opt传递顺序在PassManager的上下文中运行(当然是传统的)。我相信在使用多线程构建自定义独立LLVM工具(换句话说,不打算由opt运行)时,应该遵循该建议。有关使用LLVM API的独立应用程序的相关示例,请查看单元测试源子目录(一个提示是查找具有.cpp的{​​{1}}文件,尽管它们并非总是如此这样设置。)