Как мне сгенерировать битовый код 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.

Другие вопросы по тегам