aWsm icon indicating copy to clipboard operation
aWsm copied to clipboard

Cleanse identifier names to ensure callable from C runtime

Open bushidocodes opened this issue 2 years ago • 0 comments

It's possible that we might ingest WASI functions exported with names that are not valid C identifiers.

For example, here is a test in the wasm spec test suite:

 (func (export "type-f64-value") (result f64)
    (block (result f64) (f64.neg (br_if 0 (f64.const 4) (i32.const 1))))
  )

This seems to generate valid LLVM bitcode with the same symbol:

; Function Attrs: nounwind
define double @wasmf_type-f64-value() #1 {
entry:
  br label %b_0

exit:                                             ; preds = %b_1
  ret double %0

b_0:                                              ; preds = %entry
  br i1 true, label %b_1, label %b_2

b_1:                                              ; preds = %b_2, %b_0
  %0 = phi double [ 4.000000e+00, %b_0 ], [ -4.000000e+00, %b_2 ]
  br label %exit

b_2:                                              ; preds = %b_0
  br label %b_1
}

However, this fails when we try to link with C runtime code:

dist/br_if_0.c:12:25: error: expected ';' after top level declarator
extern double wasmf_type-f64-value();
                        ^
                        ;

This is because C only supports ASCII characters, numbers, and underscores in symbol names.

Given the way that we resolve exported symbols, I suspect that we need to encode export names. I suggest replacing invalid symbols with ASCII char codes with leading and trailing underscores.

For example, wasmf_type-f64-value would be encoded as wasmf_type_45_f64_45_value

bushidocodes avatar Aug 22 '22 18:08 bushidocodes