Skip to content

Commit 0205d22

Browse files
committed
wasm2c: Remove implicit void* conversions in tail calls
1 parent 96dfd60 commit 0205d22

File tree

4 files changed

+18
-4
lines changed

4 files changed

+18
-4
lines changed

src/c-writer.cc

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -528,6 +528,8 @@ class CWriter {
528528
std::vector<const Import*> unique_imports_;
529529
SymbolSet import_module_set_; // modules that are imported from
530530
SymbolSet import_func_module_set_; // modules that funcs are imported from
531+
SymbolMap import_func_module_map_; // mapping between imported functions and
532+
// their modules
531533

532534
std::vector<std::pair<std::string, MemoryStream>> func_sections_;
533535
SymbolSet func_includes_;
@@ -1777,6 +1779,8 @@ void CWriter::ComputeUniqueImports() {
17771779
import_module_set_.insert(import->module_name);
17781780
if (import->kind() == ExternalKind::Func) {
17791781
import_func_module_set_.insert(import->module_name);
1782+
import_func_module_map_.emplace(cast<FuncImport>(import)->func.name,
1783+
import->module_name);
17801784
}
17811785
}
17821786

@@ -2351,7 +2355,17 @@ void CWriter::WriteFuncRefWrapper(const Func* func) {
23512355
Write(") ", OpenBrace());
23522356
Write("return ");
23532357
Write(ExternalRef(ModuleFieldType::Func, func->name));
2354-
Write("(instance");
2358+
2359+
std::string target_module_name;
2360+
if (IsImport(func->name)) {
2361+
std::string external_module = import_func_module_map_[func->name];
2362+
assert(external_module != "");
2363+
target_module_name = ModuleInstanceTypeName(external_module);
2364+
} else {
2365+
target_module_name = ModuleInstanceTypeName();
2366+
}
2367+
2368+
Write("((struct ", target_module_name, "*) instance");
23552369
if (func->GetNumParams() != 0) {
23562370
Indent(4);
23572371
for (Index i = 0; i < func->GetNumParams(); ++i) {

test/wasm2c/check-imports.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -833,7 +833,7 @@ FUNC_TYPE_T(w2c_test_t1) = "\x72\xab\x00\xdf\x20\x3d\xce\xa1\xf2\x29\xc7\x9d\x13
833833
FUNC_TYPE_T(w2c_test_t2) = "\x92\xfb\x6a\xdf\x49\x07\x0a\x83\xbe\x08\x02\x68\xcd\xf6\x95\x27\x4a\xc2\xf3\xe5\xe4\x7d\x29\x49\xe8\xed\x42\x92\x6a\x9d\xda\xf0";
834834

835835
static u32 wrap_w2c_test_f1(void *instance) {
836-
return w2c_test_f1(instance);
836+
return w2c_test_f1((struct w2c_test*) instance);
837837
}
838838

839839
static void init_memories(w2c_test* instance) {

test/wasm2c/hello.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -838,7 +838,7 @@ FUNC_TYPE_T(w2c_test_t1) = "\x89\x3a\x3d\x2c\x8f\x4d\x7f\x6d\x6c\x9d\x62\x67\x29
838838
FUNC_TYPE_T(w2c_test_t2) = "\x36\xa9\xe7\xf1\xc9\x5b\x82\xff\xb9\x97\x43\xe0\xc5\xc4\xce\x95\xd8\x3c\x9a\x43\x0a\xac\x59\xf8\x4e\xf3\xcb\xfa\xb6\x14\x50\x68";
839839

840840
static u32 wrap_w2c_wasi__snapshot__preview1_fd_write(void *instance, u32 var_0, u32 var_1, u32 var_2, u32 var_3) {
841-
return w2c_wasi__snapshot__preview1_fd_write(instance, var_0, var_1, var_2, var_3);
841+
return w2c_wasi__snapshot__preview1_fd_write((struct w2c_wasi__snapshot__preview1*) instance, var_0, var_1, var_2, var_3);
842842
}
843843

844844
static const u8 data_segment_data_w2c_test_d0[] = {

test/wasm2c/tail-calls.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -841,7 +841,7 @@ FUNC_TYPE_T(w2c_test_t1) = "\x36\xa9\xe7\xf1\xc9\x5b\x82\xff\xb9\x97\x43\xe0\xc5
841841
FUNC_TYPE_T(w2c_test_t2) = "\xe5\x11\x86\xc7\x24\xdb\x44\x80\xbe\xd1\xe0\x89\xbc\xc0\x20\xea\xfb\x1c\x9a\x27\xa5\xc3\xdb\xca\x5d\xb0\x05\x0f\x7c\x03\x74\x0a";
842842

843843
static void wrap_w2c_spectest_print_i32_f32(void *instance, u32 var_0, f32 var_1) {
844-
return w2c_spectest_print_i32_f32(instance, var_0, var_1);
844+
return w2c_spectest_print_i32_f32((struct w2c_spectest*) instance, var_0, var_1);
845845
}
846846

847847
static const wasm_elem_segment_expr_t elem_segment_exprs_w2c_test_e0[] = {

0 commit comments

Comments
 (0)