执行从Rust / Python源代码

时间:2017-03-06 12:50:00

标签: python rust clang llvm llvm-ir

当我从C ++生成LLVM IR代码时,我可以使用控制台命令clang++ -emit-llvm –S test.cpp来获取test.ll文件,这是我想要的LLVM IR。

要获得可执行文件,请遵循以下步骤:

  • llvm-as test.ll - >给我test.bc文件。

  • llc test.bc --o test.s - >给我test.s文件。

  • clang++ test.s -o test.native - >给我一个我可以执行的本机文件。

对于C ++,这很好用。

理论上,当我编写Rust或Python代码时,是否应该采用相同的步骤?

我输入我的Rust代码并输入rustc test.rs --emit llvm-ir来获取LLVM IR。这再次给了我test.ll文件。

对于Python,我使用" Numba"并通过键入numba --dump-llvm test.py> test.ll来获取LLVM IR,这也为我提供了test.ll文件。

从这些.ll文件生成可执行文件的步骤应该相同。

它们一直工作到创建本机可执行文件的最后一步:

Python错误

/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特定部分(例如" PyObject"在Python中或#34;恐慌"来自Rust)用于生成.bc,.s和理论上的.native文件。

但是为什么那些甚至在IR中也是首先? LLVM IR是否应该是统一的并且这些部分必须转换,以便LLVM工具链能够与它们一起工作? 据我所知,LLVMs模块化应该允许这些步骤使用LLVM IR。有没有其他方法可以做到这一点,我不知道?

我是否可以通过其他方式生成这些语言的IR,以便提供纯粹的" clang理解的LLVM IR,还是我仍然可以从这些文件生成可执行文件,但是在没有clang的情况下以其他方式生成?

1 个答案:

答案 0 :(得分:5)

我可以说Rust代码:

你需要链接Rust的std库,如下所示:

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

请参阅Makefile的完整示例我使用here

P.S。我认为Python也是如此。您还必须提供包含此“未引用”内容的库。