2017-12-11 18 views
1

누군가 클래스를 사용하는 방법에 대한 예제를 LLVM에 줄 수 있기를 바랍니다. 내가 찾을 수있는 모든 예는 오래된 방법을 사용하는 것 같습니다.llvm에서 RandomNumberGenerator를 사용하는 방법은 무엇입니까?

'-rng-seed'매개 변수로 재정의 할 수있는 패스 내에서 RNG를 만들 수 있기를 바랍니다.

매개 변수로 제공된 경우이 값에 액세스 할 수있는 방법과 매개 변수로 제공되지 않은 경우 값을 만드는 방법은 무엇입니까?

또한 단일 모듈에 대해 단일 RNG가 스레드간에 공유되지 않는다는 것을 알고 있습니다. 모듈에서 여러 패스를 실행하는 경우 동일한 생성 된 RNG를 공유 할 수 있습니까?

+0

오래 된 예 중 하나에 대한 링크를 제공 할 수 있습니까? 거의 사용하지 않는 API 호출이기 때문에 대답을 업데이트해야 할 수도 있습니다. – compor

답변

1

RandomNumberGenerator 클래스는 전용 생성자 (그 문서와 llvm/lib/Support/RandomNumberGenerator.cpp에서 소스 파일을 확인), 그래서 유일한 방법은 인스턴스의 보류 ModulecreateRNG 방법을 통해입니다 얻을 수 (나는 적어도 알고 있음)이있다 .

그래서, 당신은 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() 인 것을 찾습니다).

+1

내가 언급 한 RNG 구현의 예는 llvm-dev-meeting-tutorial github의 DuplicateBB입니다. 그러나 내 구현은 RandomNumberGenerator에 대한 나의 이해만큼 많이 달랐다. 너는 그걸 정리 한거야, 고마워! –

+0

오 그래, Quarkslab 튜토리얼을 보았습니다. 이 API 클래스를 사용할 때마다 여전히 기억이 안납니다. – compor