LLVM IR -> WebAssembly. Wasm пустой модуль | пример - PullRequest
0 голосов
/ 15 марта 2020

Я пытаюсь сгенерировать действительный файл wasm, который будет правильно понят WebBrowser (Firefox), но я не уверен, что я делаю неправильно здесь

Вот файл Main.ll

define i32 @main() {
  ret i32 42
}

Затем я использую ll c (Linux):

. / Ll c -mtriple = wasm32-unknown-unknown -O3 - filetype = obj main.ll -o main.o

Затем я использую wasm-ld (Linux):

. / wasm-ld main. o -o main.wasm --no-entry -allow-undefined

Затем я копирую main.wasm в Windows и затем открываю страницу локального файла:

|-- fille.html
|-- main.wasm

<div id="test">
</div>

<style>
    #test
    {
        border: 3px solid red;
        width: 100%;
        height: 100%;
    }
</style>

<script>
    fetch("main.wasm")
        .then(response => response.arrayBuffer())
        .then(bytes => WebAssembly.instantiate(bytes, {}))
        .then(results => {
          window.alert(results.instance.exports.main());
        });
</script>

Но

Ошибка типа: results.instance.exports.main не является функцией

Что не так?

Вот результат:

console.log (JSON .stringify (результаты));

{"module":{},"instance":{}}

Версии:

./llc - версия

LLVM (http://llvm.org/):
LLVM version 10.0.0

. / wasm-ld - версия

LLD 10.0.0

1 Ответ

1 голос
/ 15 марта 2020

Причина в том, что вы не экспортировали никаких символов во время связывания.

Возможно, вы захотите проверить the Exports section of wasm-ld docs, но вот что они говорят о значениях по умолчанию:

При создании исполняемого файла по умолчанию экспортируются только точка входа (_start) и символы с флагом WASM_SYMBOL_EXPORTED.

У вас есть несколько вариантов:

  1. Переименование main в _start - это гарантирует, что _start будет экспортирован, и любая из его зависимостей будет правильно импортирована из среды, а не из GCd в целом, как это происходит прямо сейчас.
  2. Вызов wasm-ld с флагом --export-all - при этом будут экспортированы все символы в объектном файле. Этот вариант обычно не рекомендуется, так как вы можете предотвратить полезную оптимизацию размера и выставить вещи, которые вы не хотели показывать, но могут подойти для прототипирования.
  3. Вызовите wasm-ld с --export-dynamic - это будет экспортировать все символы, помеченные как видимые на уровне ИК.
  4. Явно перечислять символы при вызове wasm-ld, например, --export=main.

Еще одно предупреждение, о котором следует знать в все параметры, кроме (1), заключаются в том, что main обрабатывается особым образом, и с вашим текущим кодом это приведет к двум различным символам:

  1. main - автоматически сгенерированная функция-обертка с два аргумента для argc и argv, которые вызывают вашу функцию.
  2. __original_main - символ для функции, которую вы на самом деле определили.

Чтобы убедиться, что вы не Чтобы не столкнуться с этим, либо следуйте опции 1 и переименуйте main в _start, которая является точкой входа, определяемой Wasm c и не принимает никаких параметров, либо измените сигнатуру вашей функции main на правильную. а также принять как argc и argv как в C.

Надеюсь, все это должно помочь вам.

...