RandomNumberGenerator
클래스는 전용 생성자 (그 문서와 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
다시 실행하면 동일한 의사 난수가 생깁니다.
헤더를 포함하고 LLVM
지원 라이브러리 (예 : llvm-config --libfiles support
)에 대한 링크를 포함하면 -rng-seed
옵션을 사용할 수있게됩니다. 따라서 위의 실행 줄을 다음과 같이 변경하십시오.
opt -load ./libLLVMHelloPass.so -hello -rng-seed 42 foo.bc -o bar.bc
다른 시퀀스를 제공해야합니다.
마지막으로 opt
을 통해 AFAIK, LLVM
이 전달되는 것은 PassManager
(물론 기존의 경우)의 컨텍스트에서 순차적으로 실행됩니다. 멀티 스레딩을 사용하여 사용자 정의 독립 실행 형 LLVM
도구를 빌드 할 때 (즉, opt
으로 실행되지 않도록) 해당 조언을 따라야한다고 생각합니다. LLVM
API를 사용하는 독립 실행 형 앱의 관련 예제는 단위 테스트 소스 하위 디렉토리를 살펴 봅니다 (항상 그런 식으로 설정되어 있지는 않지만 한 가지 힌트는 .cpp
개의 파일이 main()
인 것을 찾습니다).
오래 된 예 중 하나에 대한 링크를 제공 할 수 있습니까? 거의 사용하지 않는 API 호출이기 때문에 대답을 업데이트해야 할 수도 있습니다. – compor