如何生成供emscripten使用的LLVM bitcode?

时间:2014-05-07 04:26:24

标签: llvm llvm-clang emscripten llvm-ir

我正在调查emscripten的个人项目,我想使用C或C ++以外的语言来实现。

然而,当我正在调查emscripten时,我认为我应该使用一个琐碎的“你好世界”#39;用C编写的例子。

我知道我应该使用emcc编译它:

$ python `which emcc` tmp.c

这将为我生成一个有效的a.out.js文件。到目前为止它还不错。

但是,我想使用不同的语言,这意味着我不能使用emcc或emcc ++,所以我想直接生成llvm bitcode。

我尝试过使用clang 3.3,这是我的mac os x 10.9.2系统上的当前版本,但以下内容不起作用:

$ clang -S -emit-llvm tmp.c -o tmp.ll
$ python `which emcc` tmp.ll      
warning: incorrect target triple 'x86_64-apple-macosx10.9.0' (did you use emcc/em++ on all source files and not clang directly?)

警告是正确的;我确实直接使用了clang,我怎么能这样做,以便我可以尝试用另一种也使用llvm的语言做同样的事情?

2 个答案:

答案 0 :(得分:2)

根据this issue,Emscripten支持CLang和Emscripten通用的wasm32-unknown-unknown-elf目标。

因此,要通过普通的Clang用您的语言将代码编译为与Emscripten兼容的LLVM位代码,您可以使用:

clang -emit-llvm --target=wasm32-unknown-unknown-elf -S test.c

并用于将生成的位码编译为WASM:

emcc -s WASM=1 test.ll

在Emscripten的测试文件linpack.c上测试了此方法-1157行代码,按预期工作。

答案 1 :(得分:0)

您需要使用emscripten的LLVM和clang(因为它尚未上游),以便您可以使用emscripten-asmjs目标发出代码。

如果你有另一种语言使用llvm,并且你可以使用它的llvm的构建,那么它应该工作。您只需要告诉该语言发出针对emscripten-asmjs目标的LLVM IR。