Следующий файл сборки (для записи, сгенерированной из битового кода с использованием llc):
.text
.file "mymod"
.section .text.asd,"",@
.globl asd # -- Begin function asd
.type asd,@function
asd: # @asd
.functype asd (f32, f32) -> (f32)
# %bb.0:
local.get 0
local.get 1
f32.add
f32.const 0x1p-1
f32.mul
# fallthrough-return-value
end_function
.Lfunc_end0:
.size asd, .Lfunc_end0-asd
# -- End function
при компиляции со следующей командной строкой:
clang -c temp.s --target=wasm32
превращается в wasmмодуль со всем там, кроме того, что имя функции отсутствует!
(module
(type (;0;) (func (param f32 f32) (result f32)))
(import "env" "__linear_memory" (memory (;0;) 0))
(import "env" "__indirect_function_table" (table (;0;) 0 funcref))
(func (;0;) (type 0) (param f32 f32) (result f32)
local.get 0
local.get 1
f32.add
f32.const 0x1p-1 (;=0.5;)
f32.mul))
Почему компилятор отбрасывает имя?Я что-то здесь неправильно понял?Как правило, компиляция с -c
- это только половина дела, но если здесь отсутствует имя и функция не экспортирована, то волшебным образом не вернется позже.Итак, как я могу заставить LLVM сохранить имя и экспортировать функцию, как это должно быть?В идеале я хотел бы сделать это программно, используя C API.Кажется логичным, что другие люди делали это раньше, так как другие инструменты, использующие LLVM, делают это правильно.