Как мне сгенерировать битовый код LLVM для использования emscripten?
Я изучаю emscripten для личного проекта и хотел бы использовать для этого язык, отличный от C или C++.
Однако, пока я занимаюсь расследованием emscripten, я решил использовать тривиальный пример "Привет, мир", написанный на C.
Я знаю, что я должен скомпилировать это с помощью 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?
2 ответа
Согласно этому вопросу, Emscripten поддерживает wasm32-unknown-unknown-elf
цель, общая для CLang и Emscripten.
Итак, для компиляции кода на вашем языке в Emscripten-совместимый LLVM-бит-код через обычный Clang вы можете использовать:
clang -emit-llvm --target=wasm32-unknown-unknown-elf -S test.c
И для компиляции результирующего битового кода в WASM:
emcc -s WASM=1 test.ll
Протестировал этот подход на тестовом файле Emscripten linpack.c
- 1157 строк кода, работает как положено.
Вам нужно использовать LLVM и clang от emscripten (так как он еще не вышел), чтобы вы могли генерировать код с помощью цели emscripten-asmjs.
Если у вас есть другой язык, использующий llvm, и вы можете использовать сборку этого llvm вместе с ним, то он должен работать. Вам просто нужно указать этот язык, чтобы излучать LLVM IR для цели emscripten-asmjs.