如何生成LLVM位码供emscripten使用



我正在为一个个人项目调查emscript,我想使用C或c++以外的语言来完成。

然而,当我在研究emscripten时,我认为我应该使用一个用c编写的简单的"hello world"示例。

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

$ python `which emcc` tmp.c

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

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

我尝试使用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的语言中做同样的事情?

根据这个问题,Emscripten支持wasm32-unknown-unknown-elf目标,CLang和amp;Emscripten .

因此,要通过纯Clang将语言中的代码编译为与emscript兼容的llvm位码,可以使用:

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

以及将生成的位码编译为WASM:

emcc -s WASM=1 test.ll

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

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

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

最新更新