Skip to content

Commit 2b3e918

Browse files
committed
c-writer.cc: cleanup handling of functions & tags (NFC)
1 parent a94a6d0 commit 2b3e918

File tree

4 files changed

+52
-60
lines changed

4 files changed

+52
-60
lines changed

src/c-writer.cc

Lines changed: 41 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,9 @@ struct GlobalName {
9494
const std::string& name;
9595
};
9696

97-
struct ExternalPtr : GlobalName {
98-
using GlobalName::GlobalName;
97+
struct TagSymbol : GlobalName {
98+
explicit TagSymbol(const std::string& name)
99+
: GlobalName(ModuleFieldType::Tag, name) {}
99100
};
100101

101102
struct ExternalRef : GlobalName {
@@ -142,11 +143,6 @@ struct SignedType {
142143
Type type;
143144
};
144145

145-
struct ResultType {
146-
explicit ResultType(const TypeVector& types) : types(types) {}
147-
const TypeVector& types;
148-
};
149-
150146
struct TryCatchLabel {
151147
TryCatchLabel(const std::string& name, size_t try_catch_stack_size)
152148
: name(name), try_catch_stack_size(try_catch_stack_size), used(false) {}
@@ -267,17 +263,18 @@ class CWriter {
267263
static std::string Mangle(std::string_view name, bool double_underscores);
268264
static std::string MangleName(std::string_view);
269265
static std::string MangleModuleName(std::string_view);
270-
std::string ExportName(std::string_view module_name,
271-
std::string_view export_name);
272-
std::string ExportName(std::string_view export_name);
266+
static std::string ExportName(std::string_view module_name,
267+
std::string_view export_name);
268+
std::string ExportName(std::string_view export_name) const;
273269
std::string ModuleInstanceTypeName() const;
274270
static std::string ModuleInstanceTypeName(std::string_view module_name);
275271
void ClaimName(SymbolSet& set,
276272
SymbolMap& map,
277273
char type_suffix,
278274
std::string_view wasm_name,
279275
const std::string& c_name);
280-
std::string FindUniqueName(SymbolSet& set, std::string_view proposed_name);
276+
std::string FindUniqueName(SymbolSet& set,
277+
std::string_view proposed_name) const;
281278
std::string ClaimUniqueName(SymbolSet& set,
282279
SymbolMap& map,
283280
char type_suffix,
@@ -334,7 +331,7 @@ class CWriter {
334331
void Write(const ParamName&);
335332
void Write(const LabelName&);
336333
void Write(const GlobalName&);
337-
void Write(const ExternalPtr&);
334+
void Write(const TagSymbol&);
338335
void Write(const ExternalRef&);
339336
void Write(const ExternalInstancePtr&);
340337
void Write(const ExternalInstanceRef&);
@@ -345,7 +342,7 @@ class CWriter {
345342
void Write(const LabelDecl&);
346343
void Write(const GlobalInstanceVar&);
347344
void Write(const StackVar&);
348-
void Write(const ResultType&);
345+
void Write(const TypeVector&);
349346
void Write(const Const&);
350347
void WriteInitExpr(const ExprList&);
351348
void WriteInitExprTerminal(const Expr*);
@@ -648,7 +645,7 @@ std::string CWriter::MangleTagTypes(const TypeVector& types) {
648645
}
649646

650647
/* The C symbol for an export from this module. */
651-
std::string CWriter::ExportName(std::string_view export_name) {
648+
std::string CWriter::ExportName(std::string_view export_name) const {
652649
return kGlobalSymbolPrefix + module_prefix_ + '_' + MangleName(export_name);
653650
}
654651

@@ -817,7 +814,7 @@ void CWriter::ClaimName(SymbolSet& set,
817814
* an integer to the symbol if necessary.
818815
*/
819816
std::string CWriter::FindUniqueName(SymbolSet& set,
820-
std::string_view proposed_name) {
817+
std::string_view proposed_name) const {
821818
std::string unique{proposed_name};
822819
if (set.find(unique) != set.end()) {
823820
std::string base = unique + "_";
@@ -1052,7 +1049,7 @@ void CWriter::Write(const GlobalName& name) {
10521049
Write(GetGlobalName(name.type, name.name));
10531050
}
10541051

1055-
void CWriter::Write(const ExternalPtr& name) {
1052+
void CWriter::Write(const TagSymbol& name) {
10561053
if (!IsImport(name.name)) {
10571054
Write("&");
10581055
}
@@ -1067,10 +1064,10 @@ void CWriter::Write(const ExternalInstancePtr& name) {
10671064
}
10681065

10691066
void CWriter::Write(const ExternalRef& name) {
1070-
if (IsImport(name.name)) {
1071-
Write("(*", GlobalName(name), ")");
1072-
} else {
1067+
if (name.type == ModuleFieldType::Func || !IsImport(name.name)) {
10731068
Write(GlobalName(name));
1069+
} else {
1070+
Write("(*", GlobalName(name), ")");
10741071
}
10751072
}
10761073

@@ -1193,13 +1190,13 @@ void CWriter::Write(SignedType type) {
11931190
// clang-format on
11941191
}
11951192

1196-
void CWriter::Write(const ResultType& rt) {
1197-
if (rt.types.empty()) {
1193+
void CWriter::Write(const TypeVector& types) {
1194+
if (types.empty()) {
11981195
Write("void");
1199-
} else if (rt.types.size() == 1) {
1200-
Write(rt.types[0]);
1196+
} else if (types.size() == 1) {
1197+
Write(types[0]);
12011198
} else {
1202-
Write("struct ", MangleMultivalueTypes(rt.types));
1199+
Write("struct ", MangleMultivalueTypes(types));
12031200
}
12041201
}
12051202

@@ -1380,16 +1377,15 @@ void CWriter::WriteInitExprTerminal(const Expr* expr) {
13801377

13811378
Write("(wasm_rt_funcref_t){", FuncTypeExpr(func_type), ", ",
13821379
"(wasm_rt_function_ptr_t)",
1383-
ExternalPtr(ModuleFieldType::Func, func->name), ", ");
1380+
ExternalRef(ModuleFieldType::Func, func->name), ", ");
13841381

13851382
if (IsImport(func->name)) {
13861383
Write("instance->", GlobalName(ModuleFieldType::Import,
13871384
import_module_sym_map_[func->name]));
13881385
} else {
13891386
Write("instance");
13901387
}
1391-
1392-
Write("};", Newline());
1388+
Write("}");
13931389
} break;
13941390

13951391
case ExprType::RefNull:
@@ -1785,7 +1781,7 @@ void CWriter::WriteFuncDeclarations() {
17851781

17861782
void CWriter::WriteFuncDeclaration(const FuncDeclaration& decl,
17871783
const std::string& name) {
1788-
Write(ResultType(decl.sig.result_types), " ", name, "(");
1784+
Write(decl.sig.result_types, " ", name, "(");
17891785
Write(ModuleInstanceTypeName(), "*");
17901786
WriteParamTypes(decl);
17911787
Write(")");
@@ -1794,15 +1790,15 @@ void CWriter::WriteFuncDeclaration(const FuncDeclaration& decl,
17941790
void CWriter::WriteImportFuncDeclaration(const FuncDeclaration& decl,
17951791
const std::string& module_name,
17961792
const std::string& name) {
1797-
Write(ResultType(decl.sig.result_types), " ", name, "(");
1793+
Write(decl.sig.result_types, " ", name, "(");
17981794
Write("struct ", ModuleInstanceTypeName(module_name), "*");
17991795
WriteParamTypes(decl);
18001796
Write(")");
18011797
}
18021798

18031799
void CWriter::WriteCallIndirectFuncDeclaration(const FuncDeclaration& decl,
18041800
const std::string& name) {
1805-
Write(ResultType(decl.sig.result_types), " ", name, "(void*");
1801+
Write(decl.sig.result_types, " ", name, "(void*");
18061802
WriteParamTypes(decl);
18071803
Write(")");
18081804
}
@@ -2153,7 +2149,7 @@ void CWriter::WriteElemInitializers() {
21532149
const Func* func = module_->GetFunc(cast<RefFuncExpr>(&expr)->var);
21542150
const FuncType* func_type = module_->GetFuncType(func->decl.type_var);
21552151
Write("{", FuncTypeExpr(func_type), ", (wasm_rt_function_ptr_t)",
2156-
ExternalPtr(ModuleFieldType::Func, func->name), ", ");
2152+
ExternalRef(ModuleFieldType::Func, func->name), ", ");
21572153
if (IsImport(func->name)) {
21582154
Write("offsetof(", ModuleInstanceTypeName(), ", ",
21592155
GlobalName(ModuleFieldType::Import,
@@ -2284,8 +2280,7 @@ void CWriter::WriteExports(CWriterPhase kind) {
22842280
local_syms_ = global_syms_;
22852281
local_sym_map_.clear();
22862282
stack_var_sym_map_.clear();
2287-
Write(ResultType(func_->decl.sig.result_types), " ", mangled_name,
2288-
"(");
2283+
Write(func_->decl.sig.result_types, " ", mangled_name, "(");
22892284
MakeTypeBindingReverseMapping(func_->GetNumParamsAndLocals(),
22902285
func_->bindings, &index_to_name);
22912286
WriteParams(index_to_name);
@@ -2337,8 +2332,10 @@ void CWriter::WriteExports(CWriterPhase kind) {
23372332
switch (export_->kind) {
23382333
case ExternalKind::Func: {
23392334
Write(OpenBrace());
2340-
Write("return ", ExternalRef(ModuleFieldType::Func, internal_name),
2341-
"(");
2335+
if (func_->GetNumResults() > 0) {
2336+
Write("return ");
2337+
}
2338+
Write(ExternalRef(ModuleFieldType::Func, internal_name), "(");
23422339

23432340
if (IsImport(internal_name)) {
23442341
Write("instance->",
@@ -2381,8 +2378,7 @@ void CWriter::WriteExports(CWriterPhase kind) {
23812378
break;
23822379

23832380
case ExternalKind::Tag:
2384-
Write("= ", ExternalPtr(ModuleFieldType::Tag, internal_name), ";",
2385-
Newline());
2381+
Write("= ", TagSymbol(internal_name), ";", Newline());
23862382
break;
23872383

23882384
default:
@@ -2485,7 +2481,7 @@ void CWriter::WriteInitInstanceImport() {
24852481
Write(", struct ", ModuleInstanceTypeName(import_module_name), "* ",
24862482
GlobalName(ModuleFieldType::Import, import_module_name));
24872483
}
2488-
Write(")", OpenBrace());
2484+
Write(") ", OpenBrace());
24892485

24902486
for (const auto& import_module : import_func_module_set_) {
24912487
Write("instance->", GlobalName(ModuleFieldType::Import, import_module),
@@ -2638,7 +2634,7 @@ void CWriter::Write(const Func& func) {
26382634
Write(Newline());
26392635

26402636
PushFuncSection();
2641-
Write(ResultType(func.decl.sig.result_types), " ",
2637+
Write(func.decl.sig.result_types, " ",
26422638
GlobalName(ModuleFieldType::Func, func.name), "(");
26432639
WriteParamsAndLocals();
26442640
Write("FUNC_PROLOGUE;", Newline());
@@ -2661,7 +2657,7 @@ void CWriter::Write(const Func& func) {
26612657
Write("return ", StackVar(0), ";", Newline());
26622658
} else if (num_results >= 2) {
26632659
Write(OpenBrace());
2664-
Write(ResultType(func.decl.sig.result_types), " tmp;", Newline());
2660+
Write(func.decl.sig.result_types, " tmp;", Newline());
26652661
for (Index i = 0; i < num_results; ++i) {
26662662
Type type = func.GetResultType(i);
26672663
Writef("tmp.%c%d = ", MangleType(type), i);
@@ -2905,8 +2901,7 @@ void CWriter::Write(const Catch& c) {
29052901
}
29062902

29072903
Write("if (wasm_rt_exception_tag() == ",
2908-
ExternalPtr(ModuleFieldType::Tag, module_->GetTag(c.var)->name), ") ",
2909-
OpenBrace());
2904+
TagSymbol(module_->GetTag(c.var)->name), ") ", OpenBrace());
29102905

29112906
const Tag* tag = module_->GetTag(c.var);
29122907
const FuncDeclaration& tag_type = tag->decl;
@@ -3383,7 +3378,7 @@ void CWriter::Write(const ExprList& exprs) {
33833378

33843379
Write(StackVar(0), " = (wasm_rt_funcref_t){", FuncTypeExpr(func_type),
33853380
", (wasm_rt_function_ptr_t)",
3386-
ExternalPtr(ModuleFieldType::Func, func->name), ", ");
3381+
ExternalRef(ModuleFieldType::Func, func->name), ", ");
33873382

33883383
if (IsImport(func->name)) {
33893384
Write("instance->", GlobalName(ModuleFieldType::Import,
@@ -3511,12 +3506,10 @@ void CWriter::Write(const ExprList& exprs) {
35113506

35123507
Index num_params = tag->decl.GetNumParams();
35133508
if (num_params == 0) {
3514-
Write("wasm_rt_load_exception(",
3515-
ExternalPtr(ModuleFieldType::Tag, tag->name), ", 0, NULL);",
3509+
Write("wasm_rt_load_exception(", TagSymbol(tag->name), ", 0, NULL);",
35163510
Newline());
35173511
} else if (num_params == 1) {
3518-
Write("wasm_rt_load_exception(",
3519-
ExternalPtr(ModuleFieldType::Tag, tag->name), ", sizeof(",
3512+
Write("wasm_rt_load_exception(", TagSymbol(tag->name), ", sizeof(",
35203513
tag->decl.GetParamType(0), "), &", StackVar(0), ");",
35213514
Newline());
35223515
} else {
@@ -3527,8 +3520,7 @@ void CWriter::Write(const ExprList& exprs) {
35273520
Write(StackVar(i), ", ");
35283521
}
35293522
Write("};", Newline());
3530-
Write("wasm_rt_load_exception(",
3531-
ExternalPtr(ModuleFieldType::Tag, tag->name),
3523+
Write("wasm_rt_load_exception(", TagSymbol(tag->name),
35323524
", sizeof(tmp), &tmp);", Newline());
35333525
Write(CloseBrace(), Newline());
35343526
}

test/wasm2c/check-imports.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -702,7 +702,7 @@ static void init_memories(w2c_test* instance) {
702702
}
703703

704704
static const wasm_elem_segment_expr_t elem_segment_exprs_w2c_test_e0[] = {
705-
{w2c_test_t1, (wasm_rt_function_ptr_t)&w2c_test_f1, 0},
705+
{w2c_test_t1, (wasm_rt_function_ptr_t)w2c_test_f1, 0},
706706
};
707707

708708
static void init_tables(w2c_test* instance) {
@@ -712,7 +712,7 @@ static void init_tables(w2c_test* instance) {
712712
static void init_elem_instances(w2c_test *instance) {
713713
}
714714

715-
static void init_instance_import(w2c_test* instance, struct w2c_env* w2c_env_instance){
715+
static void init_instance_import(w2c_test* instance, struct w2c_env* w2c_env_instance) {
716716
instance->w2c_env_0x5F_indirect_function_table = w2c_env_0x5F_indirect_function_table(w2c_env_instance);
717717
instance->w2c_env_0x5F_linear_memory = w2c_env_0x5F_linear_memory(w2c_env_instance);
718718
}

test/wasm2c/export-names.txt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -699,30 +699,30 @@ static void init_memories(w2c_test* instance) {
699699

700700
/* export: '' */
701701
void w2c_test_(w2c_test* instance) {
702-
return w2c_test__0(instance);
702+
w2c_test__0(instance);
703703
}
704704

705705
/* export: '*\2F' */
706706
void w2c_test_0x2A0x2F(w2c_test* instance) {
707-
return w2c_test__0(instance);
707+
w2c_test__0(instance);
708708
}
709709

710710
/* export: '\3F\3F\2F' */
711711
void w2c_test_0x3F0x3F0x2F(w2c_test* instance) {
712-
return w2c_test__0(instance);
712+
w2c_test__0(instance);
713713
}
714714

715715
/* export: '\0A' */
716716
void w2c_test_0x0A(w2c_test* instance) {
717-
return w2c_test__0(instance);
717+
w2c_test__0(instance);
718718
}
719719

720720
/* export: '\E2\9D\A4\EF\B8\8F' */
721721
void w2c_test_0xE20x9D0xA40xEF0xB80x8F(w2c_test* instance) {
722-
return w2c_test__0(instance);
722+
w2c_test__0(instance);
723723
}
724724

725-
static void init_instance_import(w2c_test* instance, struct w2c_0x5Cmodule* w2c_0x5Cmodule_instance){
725+
static void init_instance_import(w2c_test* instance, struct w2c_0x5Cmodule* w2c_0x5Cmodule_instance) {
726726
instance->w2c_0x5Cmodule_import0x200x2A0x2F = w2c_0x5Cmodule_import0x200x2A0x2F(w2c_0x5Cmodule_instance);
727727
}
728728

test/wasm2c/hello.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -736,10 +736,10 @@ wasm_rt_memory_t* w2c_test_memory(w2c_test* instance) {
736736

737737
/* export: '_start' */
738738
void w2c_test_0x5Fstart(w2c_test* instance) {
739-
return w2c_test_0x5Fstart_0(instance);
739+
w2c_test_0x5Fstart_0(instance);
740740
}
741741

742-
static void init_instance_import(w2c_test* instance, struct w2c_wasi__snapshot__preview1* w2c_wasi__snapshot__preview1_instance){
742+
static void init_instance_import(w2c_test* instance, struct w2c_wasi__snapshot__preview1* w2c_wasi__snapshot__preview1_instance) {
743743
instance->w2c_wasi__snapshot__preview1_instance = w2c_wasi__snapshot__preview1_instance;
744744
}
745745

@@ -805,7 +805,7 @@ void w2c_test_0x5Fstart_0(w2c_test* instance) {
805805
var_i3 = 0u;
806806
var_i4 = 0u;
807807
var_i0 = CALL_INDIRECT(instance->w2c_T0, u32 (*)(void*, u32, u32, u32, u32), w2c_test_t0, var_i4, instance->w2c_T0.data[var_i4].module_instance, var_i0, var_i1, var_i2, var_i3);
808-
(*w2c_wasi__snapshot__preview1_proc_exit)(instance->w2c_wasi__snapshot__preview1_instance, var_i0);
808+
w2c_wasi__snapshot__preview1_proc_exit(instance->w2c_wasi__snapshot__preview1_instance, var_i0);
809809
FUNC_EPILOGUE;
810810
}
811811
;;; STDOUT ;;)

0 commit comments

Comments
 (0)