Skip to content

compiler: avoid saving foreign call target to local when there are no caller-save GlobalRegs

Cheng Shao requested to merge wip/wasm-no-tmp-callee into master

This patch makes the STG->Cmm backend avoid saving foreign call target to local when there are no caller-save GlobalRegs.

Since 321941a8, when we lower a foreign call, we unconditionally save the foreign call target to a temporary local first, then rely on cmmSink to clean it up later, which only happens with -fcmm-sink (implied by -O) and not in unoptimized code.

And this is troublesome for the wasm backend NCG, which needs to infer a foreign call target symbol's type signature from the Cmm call site. Previously, the NCG has been emitting incorrect type signatures for unoptimized code, which happens to work with wasm-ld most of the time, but this is never future-proof against upstream toolchain updates, and it causes horrible breakages when LTO objects are included in linker input. Hence this patch.

Merge request reports