我希望有人可以举例说明如何在LLVM
中使用RandomNumberGenerator
类。我能找到的所有例子似乎都使用了过时的方法。
我希望能够在传递中创建一个可以使用'-rng-seed'参数覆盖的RNG。
如果将该值作为参数提供,该如何访问该值,如果未将其作为参数提供,如何创建该值?
另外,我知道单个模块的线程之间不能共享单个RNG。如果我在模块上运行多次传递,他们可以共享相同的生成RNG吗?
答案 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;
}
现在你可以在这样的模块上运行它(假设你修改了documentation的hello 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}}文件,尽管它们并非总是如此这样设置。)