2017-03-06 4 views
4

C++에서 LLVM IR 코드를 생성 할 때 콘솔 명령 clang++ -emit-llvm –S test.cpp을 사용하여 내가 원하는 LLVM IR 인 test.ll 파일을 얻을 수 있습니다. Rust/Python 소스 코드에서 생성 된 LLVM IR 코드

이 실행 파일을 얻으려면이 따를 수있는 단계는 다음과 같습니다

  • llvm-as test.ll가 -> 나에게 test.bc 파일을 제공합니다.

  • llc test.bc --o test.s -> 내게 test.s 파일을 제공합니다.

  • clang++ test.s -o test.native -> 내가 실행할 수있는 기본 파일을 제공합니다.

C++의 경우에는 정상적으로 작동합니다.

이론상 녹 또는 파이썬 코드를 쓸 때 동일한 단계를 적용해야합니까?

내 녹 코드를 받아서 rustc test.rs --emit llvm-ir을 입력하여 LLVM IR을 얻습니다. 이것은 나에게 test.ll 파일을 다시 준다.

파이썬의 경우 "Numba"를 사용하고 numba --dump-llvm test.py> test.ll을 입력하여 LLVM IR을 얻습니다.이 또한 test.ll 파일을 제공합니다.

이러한 .ll 파일에서 실행 파일을 생성하는 단계는 동일해야합니다.

파이썬 오류

/tmp/test-9aa440.o: In function 'main': 
test.bc:(.text+0x67): undefined reference to 'numba_gil_ensure' 
test.bc:(.text+0x79): undefined reference to 'numba_unpickle' 
test.bc:(.text+0x84): undefined reference to 'PyObject_Str' 
test.bc:(.text+0x8f): undefined reference to 'PyString_AsString' 
test.bc:(.text+0xa1): undefined reference to 'PySys_WriteStdout' 
test.bc:(.text+0xa9): undefined reference to 'Py_DecRef' 
test.bc:(.text+0xb1): undefined reference to 'Py_DecRef' 
test.bc:(.text+0xbd): undefined reference to 'PySys_WriteStdout' 
test.bc:(.text+0xc5): undefined reference to 'numba_gil_release' 
test.bc:(.text+0xff): undefined reference to 'numba_gil_ensure' 
test.bc:(.text+0x10b): undefined reference to 'PySys_WriteStdout' 
test.bc:(.text+0x113): undefined reference to 'numba_gil_release' 
clang: error: linker command failed with exit code 1 (use -v to see  invocation) 

녹 오류

/tmp/main-5e59bd.o: In function ‘main::sum::h514304ffa40dd7c3’: 
main.bc:(.text+0xf): undefined reference to ‘core::panicking::panic::h2596388ccef1871c’ 
/tmp/main-5e59bd.o: In function ‘main’: main.bc:(.text+0x53): undefined reference to ‘std::rt::lang_start::h65647f6e36cffdae’ 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

내가이에서 얻을 것이 있다는 것입니다 :

그들은 기본 실행 파일을 생성하는 마지막 단계까지 작업 clang은 LLVM IR 파일의 Rust/Python 특정 부분을 이해하지 못합니다 (예 : "PyO 파이썬에서 "bject"또는 Rust에서 "panic") .bc, .s 및 .native 파일을 생성하는 데 사용되었습니다.

하지만 처음에는 정보 검색 (IR)에있는 이유가 무엇입니까? LLVM IR이 균일해야하며 해당 부분이 변형되어 LLVM 툴체인이 함께 작업 할 수 있습니까? LLVM의 모듈성은 LLVM IR을 사용하여 이러한 단계를 허용해야합니다. 이 일을하는 또 다른 방법이 있을지 모르겠습니다.

clang이 이해할 수있는 "순수한"LLVM IR을 제공하는 다른 방법으로 해당 언어의 IR을 생성 할 수 있습니까? 아니면 그 파일에서 실행 파일을 생성 할 수 있습니까?

+0

Possible Linked to : http://stackoverflow.com/questions/15169015/call-python-code-from-llvm-jit?rq=1 – MKesper

+0

.ll 소스를 검사 할 경우 외부에서 정의 된 함수에 대한 참조를 찾아야합니다. 파이썬과 녹이 모두. C++ 소스에서 생성 된 IR에 대해서도 마찬가지 일 수 있지만'clang ++'에는 C++ 표준 lib가 기본적으로 포함되어 있습니다. – SPAT

답변

4

나는 녹 코드 말할 수 있습니다

는이 같은 녹의 표준 라이브러리 뭔가를 연결해야합니다

$(LLI) -load /Users/Stanislaw/.rustup/toolchains/stable-x86_64-apple-darwin/lib/libstd-f5a209a9.dylib ./target/debug/jitrust.bc 

내가 here를 사용하는 메이크 파일의 전체 예제를 참조하십시오.

P. 나는 파이썬에 대해서도 마찬가지라고 생각한다.이 "참조되지 않은"자료가 들어있는 라이브러리도 제공해야합니다.

+1

고마워, 나는'clang PATH/TO/RUSTLIB test.s -o test.native'를 사용하여 나중에 생성하여 실행할 수있다. 파이썬도 이와 같이 작동해야합니다. 나는 내가 그 해결책을 찾았을 때 갱신 할 것이다. – Weber

+1

비슷한 방식으로 파이썬과 함께 작동 시키려고했지만, 할 수 없었습니다. numba로 IR을 생성 할 때, python lib 만 연결하면 clang에 충분하지 않습니다. numba를 연결할 때 .so 파일이 없으므로 불가능합니다. clang이 누락 된 numba 함수를 찾을 수는 있지만 localy에서만 사용할 수 있습니다. 또한 내부 파이썬 스크립트 인 numba는 파이썬 환경에서 호출되어야합니다. 나는 IR을 생성하기 위해 numba를 사용하여 clang으로 파이썬 IR을 컴파일하는 방법을 보지 못했다. 가능하다면 numba없이 IR을 생성 할 수는 있지만 numba로는 불가능하다고 생각합니다. – Weber