summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/c-writer.cc53
-rwxr-xr-xtest/run-spec-wasm2c.py15
-rw-r--r--test/spec-wasm2c-prefix.c18
-rw-r--r--wasm2c/README.md17
-rw-r--r--wasm2c/examples/fac/fac.c4
-rw-r--r--wasm2c/examples/fac/fac.h2
-rw-r--r--wasm2c/examples/fac/main.c4
-rw-r--r--wasm2c/examples/rot13/main.c14
8 files changed, 36 insertions, 91 deletions
diff --git a/src/c-writer.cc b/src/c-writer.cc
index e2bef4a3..fadd88d4 100644
--- a/src/c-writer.cc
+++ b/src/c-writer.cc
@@ -161,13 +161,8 @@ class CWriter {
static std::string Deref(const std::string&);
static char MangleType(Type);
- static std::string MangleTypes(const TypeVector&);
static std::string MangleMultivalueTypes(const TypeVector&);
static std::string MangleName(std::string_view);
- static std::string MangleFuncName(std::string_view,
- const TypeVector& param_types,
- const TypeVector& result_types);
- static std::string MangleGlobalName(std::string_view, Type);
static std::string LegalizeName(std::string_view);
static std::string ExportName(std::string_view mangled_name);
std::string DefineName(SymbolSet*, std::string_view);
@@ -396,18 +391,6 @@ char CWriter::MangleType(Type type) {
}
// static
-std::string CWriter::MangleTypes(const TypeVector& types) {
- if (types.empty())
- return std::string("v");
-
- std::string result;
- for (auto type : types) {
- result += MangleType(type);
- }
- return result;
-}
-
-// static
std::string CWriter::MangleMultivalueTypes(const TypeVector& types) {
assert(types.size() >= 2);
std::string result = "wasm_multi_";
@@ -437,20 +420,6 @@ std::string CWriter::MangleName(std::string_view name) {
}
// static
-std::string CWriter::MangleFuncName(std::string_view name,
- const TypeVector& param_types,
- const TypeVector& result_types) {
- std::string sig = MangleTypes(result_types) + MangleTypes(param_types);
- return MangleName(name) + MangleName(sig);
-}
-
-// static
-std::string CWriter::MangleGlobalName(std::string_view name, Type type) {
- std::string sig(1, MangleType(type));
- return MangleName(name) + MangleName(sig);
-}
-
-// static
std::string CWriter::ExportName(std::string_view mangled_name) {
return "WASM_RT_ADD_PREFIX(" + std::string(mangled_name) + ")";
}
@@ -889,22 +858,17 @@ void CWriter::WriteImports() {
switch (import->kind()) {
case ExternalKind::Func: {
const Func& func = cast<FuncImport>(import)->func;
- WriteFuncDeclaration(
- func.decl,
- DefineImportName(
- func.name, import->module_name,
- MangleFuncName(import->field_name, func.decl.sig.param_types,
- func.decl.sig.result_types)));
+ WriteFuncDeclaration(func.decl,
+ DefineImportName(func.name, import->module_name,
+ MangleName(import->field_name)));
Write(";");
break;
}
case ExternalKind::Global: {
const Global& global = cast<GlobalImport>(import)->global;
- WriteGlobal(global,
- DefineImportName(
- global.name, import->module_name,
- MangleGlobalName(import->field_name, global.type)));
+ WriteGlobal(global, DefineImportName(global.name, import->module_name,
+ MangleName(import->field_name)));
Write(";");
break;
}
@@ -1177,9 +1141,7 @@ void CWriter::WriteExports(WriteExportsKind kind) {
switch (export_->kind) {
case ExternalKind::Func: {
const Func* func = module_->GetFunc(export_->var);
- mangled_name =
- ExportName(MangleFuncName(export_->name, func->decl.sig.param_types,
- func->decl.sig.result_types));
+ mangled_name = ExportName(MangleName(export_->name));
internal_name = func->name;
if (kind != WriteExportsKind::Initializers) {
WriteFuncDeclaration(func->decl, Deref(mangled_name));
@@ -1190,8 +1152,7 @@ void CWriter::WriteExports(WriteExportsKind kind) {
case ExternalKind::Global: {
const Global* global = module_->GetGlobal(export_->var);
- mangled_name =
- ExportName(MangleGlobalName(export_->name, global->type));
+ mangled_name = ExportName(MangleName(export_->name));
internal_name = global->name;
if (kind != WriteExportsKind::Initializers) {
WriteGlobal(*global, Deref(mangled_name));
diff --git a/test/run-spec-wasm2c.py b/test/run-spec-wasm2c.py
index 7ecdc5f8..3e7f7574 100755
--- a/test/run-spec-wasm2c.py
+++ b/test/run-spec-wasm2c.py
@@ -311,24 +311,11 @@ class CWriter(object):
def _CompareList(self, consts):
return ' && '.join(self._Compare(num, const) for num, const in enumerate(consts))
- def _ActionSig(self, action, expected):
- type_ = action['type']
- result_types = [result['type'] for result in expected]
- arg_types = [arg['type'] for arg in action.get('args', [])]
- if type_ == 'invoke':
- return MangleTypes(result_types) + MangleTypes(arg_types)
- elif type_ == 'get':
- return MangleType(result_types[0])
- else:
- raise Error('Unexpected action type: %s' % type_)
-
def _Action(self, command):
action = command['action']
- expected = command['expected']
type_ = action['type']
mangled_module_name = self.GetModulePrefix(action.get('module'))
- field = (mangled_module_name + MangleName(action['field']) +
- MangleName(self._ActionSig(action, expected)))
+ field = mangled_module_name + MangleName(action['field'])
if type_ == 'invoke':
return '%s(%s)' % (field, self._ConstantList(action.get('args', [])))
elif type_ == 'get':
diff --git a/test/spec-wasm2c-prefix.c b/test/spec-wasm2c-prefix.c
index bad8f647..4415be6f 100644
--- a/test/spec-wasm2c-prefix.c
+++ b/test/spec-wasm2c-prefix.c
@@ -235,18 +235,16 @@ static wasm_rt_memory_t spectest_memory;
static uint32_t spectest_global_i32 = 666;
static uint64_t spectest_global_i64 = 666l;
-void (*Z_spectestZ_printZ_vv)(void) = &spectest_print;
-void (*Z_spectestZ_print_i32Z_vi)(uint32_t) = &spectest_print_i32;
-void (*Z_spectestZ_print_f32Z_vf)(float) = &spectest_print_f32;
-void (*Z_spectestZ_print_i32_f32Z_vif)(uint32_t,
- float) = &spectest_print_i32_f32;
-void (*Z_spectestZ_print_f64Z_vd)(double) = &spectest_print_f64;
-void (*Z_spectestZ_print_f64_f64Z_vdd)(double,
- double) = &spectest_print_f64_f64;
+void (*Z_spectestZ_print)(void) = &spectest_print;
+void (*Z_spectestZ_print_i32)(uint32_t) = &spectest_print_i32;
+void (*Z_spectestZ_print_f32)(float) = &spectest_print_f32;
+void (*Z_spectestZ_print_i32_f32)(uint32_t, float) = &spectest_print_i32_f32;
+void (*Z_spectestZ_print_f64)(double) = &spectest_print_f64;
+void (*Z_spectestZ_print_f64_f64)(double, double) = &spectest_print_f64_f64;
wasm_rt_table_t* Z_spectestZ_table = &spectest_table;
wasm_rt_memory_t* Z_spectestZ_memory = &spectest_memory;
-uint32_t* Z_spectestZ_global_i32Z_i = &spectest_global_i32;
-uint64_t* Z_spectestZ_global_i64Z_j = &spectest_global_i64;
+uint32_t* Z_spectestZ_global_i32 = &spectest_global_i32;
+uint64_t* Z_spectestZ_global_i64 = &spectest_global_i64;
static void init_spectest_module(void) {
wasm_rt_allocate_memory(&spectest_memory, 1, 2);
diff --git a/wasm2c/README.md b/wasm2c/README.md
index 3e335c74..b68fe57a 100644
--- a/wasm2c/README.md
+++ b/wasm2c/README.md
@@ -48,21 +48,21 @@ files.
To actually use our fac module, we'll use create a new file, `main.c`, that
include `fac.h`, initializes the module, and calls `fac`.
-`wasm2c` generates a few symbols for us, `init` and `Z_facZ_ii`. `init`
-initializes the module, and `Z_facZ_ii` is our exported `fac` function, but
+`wasm2c` generates a few symbols for us, `init` and `Z_fac`. `init`
+initializes the module, and `Z_fac` is our exported `fac` function, but
[name-mangled](https://en.wikipedia.org/wiki/Name_mangling) to include the
function signature.
We can define `WASM_RT_MODULE_PREFIX` before including `fac.h` to generate
these symbols with a prefix, in case we already have a symbol called `init` (or
-even `Z_facZ_ii`!) Note that you'll have to compile `fac.c` with this macro
+even `Z_fac`!) Note that you'll have to compile `fac.c` with this macro
too, for this to work.
```c
#include <stdio.h>
#include <stdlib.h>
-/* Uncomment this to define fac_init and fac_Z_facZ_ii instead. */
+/* Uncomment this to define fac_init and fac_Z_fac instead. */
/* #define WASM_RT_MODULE_PREFIX fac_ */
#include "fac.h"
@@ -83,7 +83,7 @@ int main(int argc, char** argv) {
init();
/* Call `fac`, using the mangled name. */
- u32 result = Z_facZ_ii(x);
+ u32 result = Z_fac(x);
/* Print the result. */
printf("fac(%u) -> %u\n", x, result);
@@ -138,7 +138,7 @@ extern "C" {
extern void WASM_RT_ADD_PREFIX(init)(void);
/* export: 'fac' */
-extern u32 (*WASM_RT_ADD_PREFIX(Z_facZ_ii))(u32);
+extern u32 (*WASM_RT_ADD_PREFIX(Z_fac))(u32);
#ifdef __cplusplus
}
#endif
@@ -345,15 +345,14 @@ the module can be used:
extern void WASM_RT_ADD_PREFIX(init)(void);
/* export: 'fac' */
-extern u32 (*WASM_RT_ADD_PREFIX(Z_facZ_ii))(u32);
+extern u32 (*WASM_RT_ADD_PREFIX(Z_fac))(u32);
```
All exported names use `WASM_RT_ADD_PREFIX` (as described above) to allow the
symbols to placed in a namespace as decided by the embedder. All symbols are
also mangled so they include the types of the function signature.
-In our example, `Z_facZ_ii` is the mangling for a function named `fac` that
-takes one `i32` parameter and returns one `i32` result.
+In our example, `Z_fac` is the mangling for a function named `fac`.
## A quick look at `fac.c`
diff --git a/wasm2c/examples/fac/fac.c b/wasm2c/examples/fac/fac.c
index 945c9967..b307d089 100644
--- a/wasm2c/examples/fac/fac.c
+++ b/wasm2c/examples/fac/fac.c
@@ -332,11 +332,11 @@ static void init_table(void) {
}
/* export: 'fac' */
-u32 (*WASM_RT_ADD_PREFIX(Z_facZ_ii))(u32);
+u32 (*WASM_RT_ADD_PREFIX(Z_fac))(u32);
static void init_exports(void) {
/* export: 'fac' */
- WASM_RT_ADD_PREFIX(Z_facZ_ii) = (&w2c_fac);
+ WASM_RT_ADD_PREFIX(Z_fac) = (&w2c_fac);
}
void WASM_RT_ADD_PREFIX(init)(void) {
diff --git a/wasm2c/examples/fac/fac.h b/wasm2c/examples/fac/fac.h
index 41c50d4d..9a6a9aba 100644
--- a/wasm2c/examples/fac/fac.h
+++ b/wasm2c/examples/fac/fac.h
@@ -35,7 +35,7 @@ typedef double f64;
extern void WASM_RT_ADD_PREFIX(init)(void);
/* export: 'fac' */
-extern u32 (*WASM_RT_ADD_PREFIX(Z_facZ_ii))(u32);
+extern u32 (*WASM_RT_ADD_PREFIX(Z_fac))(u32);
#ifdef __cplusplus
}
#endif
diff --git a/wasm2c/examples/fac/main.c b/wasm2c/examples/fac/main.c
index 55255b5d..fe79aa94 100644
--- a/wasm2c/examples/fac/main.c
+++ b/wasm2c/examples/fac/main.c
@@ -1,7 +1,7 @@
#include <stdio.h>
#include <stdlib.h>
-/* Uncomment this to define fac_init and fac_Z_facZ_ii instead. */
+/* Uncomment this to define fac_init and fac_Z_fac instead. */
/* #define WASM_RT_MODULE_PREFIX fac_ */
#include "fac.h"
@@ -22,7 +22,7 @@ int main(int argc, char** argv) {
init();
/* Call `fac`, using the mangled name. */
- u32 result = Z_facZ_ii(x);
+ u32 result = Z_fac(x);
/* Print the result. */
printf("fac(%u) -> %u\n", x, result);
diff --git a/wasm2c/examples/rot13/main.c b/wasm2c/examples/rot13/main.c
index 19ec799e..c5ba0e9d 100644
--- a/wasm2c/examples/rot13/main.c
+++ b/wasm2c/examples/rot13/main.c
@@ -17,15 +17,15 @@
#include <stdio.h>
#include <stdlib.h>
-/* Uncomment this to define rot13_init rot13_Z_rot13Z_vv instead. */
+/* Uncomment this to define rot13_init rot13_Z_rot13 instead. */
/* #define WASM_RT_MODULE_PREFIX rot13_ */
#include "rot13.h"
/* Define the imports as declared in rot13.h. */
wasm_rt_memory_t (*Z_hostZ_mem);
-u32 (*Z_hostZ_fill_bufZ_iii)(u32, u32);
-void (*Z_hostZ_buf_doneZ_vii)(u32, u32);
+u32 (*Z_hostZ_fill_buf)(u32, u32);
+void (*Z_hostZ_buf_done)(u32, u32);
/* Define the implementations of the imports. */
static wasm_rt_memory_t s_memory;
@@ -49,10 +49,10 @@ int main(int argc, char** argv) {
/* Provide the imports expected by the module: "host.mem", "host.fill_buf"
* and "host.buf_done". Their mangled names are `Z_hostZ_mem`,
- * `Z_hostZ_fill_bufZ_iii` and `Z_hostZ_buf_doneZ_vii`. */
+ * `Z_hostZ_fill_buf` and `Z_hostZ_buf_done`. */
Z_hostZ_mem = &s_memory;
- Z_hostZ_fill_bufZ_iii = &fill_buf;
- Z_hostZ_buf_doneZ_vii = &buf_done;
+ Z_hostZ_fill_buf = &fill_buf;
+ Z_hostZ_buf_done = &buf_done;
/* Call `rot13` on each argument, using the mangled name. */
while (argc > 1) {
@@ -60,7 +60,7 @@ int main(int argc, char** argv) {
argc--; argv++;
s_input = argv[0];
- Z_rot13Z_vv();
+ Z_rot13();
}
/* Free the Wasm runtime state. */