【问题标题】:How do I generate LLVM bitcode for use by emscripten?如何生成供 emscripten 使用的 LLVM 位码?
【发布时间】:2014-06-23 21:29:06
【问题描述】:

我正在为一个个人项目调查 emscripten,我想使用 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的语言做同样的事情?

【问题讨论】:

  • 所以,我不完全确定,但我认为如果您使用 Clang 定位 i386,它可能会起作用:github.com/kripken/emscripten/blob/… 只是一种直觉 - 我还没有尝试过。跨度>
  • 这个问题已经过去了大约 2 年,所以我想知道您是否找到了解决方案,因为我将研究相同的用例。 Emscripten 网站似乎建议任何编译为 LLVM IR 的语言都可以工作。正如其他答案和 cmets 所暗示的,我知道这可能不是 100% 正确的。
  • @MatthewSanders:我最终放弃了,因为事实证明这是一个难题。基本上 emscripten 对你想要什么样的 llvm 有一个非常具体的想法,我最终希望让 haskell 的 llvm 输出与 emscripten 的 llvm 输入一起工作。然而,就目前而言,今天,ghcjs(和 purescript)对于我的目的来说要好得多。
  • 感谢您的跟进。是的... emscripten 的一个大问题是它在某一时刻与 llvm 不同,这使得跟上上游变化变得更加困难。听起来 LLVM 上游开始获得对 webassembly 的支持,从长远来看,无论如何,恕我直言。

标签: llvm llvm-clang emscripten llvm-ir


【解决方案1】:

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

因此,要通过普通 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 行代码,按预期工作。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 没有-emit-llvm选项的clang这样做吗?
    • 我不知道这个事实,但我觉得答案是否定的。 LLVM 位码有一个“目标三元组”,这对于完全与设备无关的 IR 没有意义……所以我想 LLVM 位码不是 100% 与设备无关的……这只会引发比答案更多的问题。 >_
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    相关资源
    最近更新 更多