emitBarf generates incorrect barf() call on wasm target
emitBarf
generates a ccall in Cmm that calls barf()
with a single literal string argument. However, barf()
is a variadic C function, and this works on other platforms only because their C ABI happens to permit calling barf()
as if it's defined as void barf(char*);
. But not on wasm.
We should have a non-variadic wrapper for barf()
in the RTS, and call that wrapper whenever a single string argument is to be passed. This will fix the occasional wasm-ld: warning: function signature mismatch: barf
warnings, especially when -dtag-inference-checks
is enabled.