summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/asm_v_wasm.h21
-rw-r--r--src/s2wasm.h16
-rw-r--r--test/dot_s/asm_const.wast2
-rw-r--r--test/dot_s/basics.wast2
-rw-r--r--test/dot_s/call.wast12
-rw-r--r--test/dot_s/cfg-stackify.wast2
-rw-r--r--test/dot_s/exit.wast2
-rw-r--r--test/dot_s/f32.wast2
-rw-r--r--test/dot_s/f64.wast2
-rw-r--r--test/dot_s/frem.wast4
-rw-r--r--test/dot_s/global.wast2
-rw-r--r--test/dot_s/legalize.wast4
-rw-r--r--test/dot_s/memops.wast2
-rw-r--r--test/dot_s/returned.wast6
-rw-r--r--test/dot_s/unused-argument.wast2
-rw-r--r--test/dot_s/vtable.wast2
16 files changed, 54 insertions, 29 deletions
diff --git a/src/asm_v_wasm.h b/src/asm_v_wasm.h
index a19334c2c..f0065bbf9 100644
--- a/src/asm_v_wasm.h
+++ b/src/asm_v_wasm.h
@@ -46,6 +46,7 @@ AsmType wasmToAsmType(WasmType type) {
char getSig(WasmType type) {
switch (type) {
case i32: return 'i';
+ case i64: return 'j';
case f32: return 'f';
case f64: return 'd';
case none: return 'v';
@@ -80,6 +81,26 @@ std::string getSig(CallBase *call) {
return ret;
}
+WasmType sigToWasmType(char sig) {
+ switch (sig) {
+ case 'i': return i32;
+ case 'j': return i64;
+ case 'f': return f32;
+ case 'd': return f64;
+ case 'v': return none;
+ default: abort();
+ }
+}
+
+FunctionType sigToFunctionType(std::string sig) {
+ FunctionType ret;
+ ret.result = sigToWasmType(sig[0]);
+ for (size_t i = 1; i < sig.size(); i++) {
+ ret.params.push_back(sigToWasmType(sig[i]));
+ }
+ return ret;
+}
+
} // namespace wasm
#endif // wasm_asm_v_wasm_h
diff --git a/src/s2wasm.h b/src/s2wasm.h
index 4811632b1..9d50693e9 100644
--- a/src/s2wasm.h
+++ b/src/s2wasm.h
@@ -552,12 +552,6 @@ private:
auto specific = allocator.alloc<CallImport>();
specific->target = target;
curr = specific;
- if (wasm.importsMap.count(target) == 0) {
- auto import = allocator.alloc<Import>();
- import->name = import->base = target;
- import->module = ENV;
- wasm.addImport(import);
- }
}
}
curr->type = type;
@@ -585,6 +579,15 @@ private:
} else {
call->fullType = wasm.functionTypesMap[typeName];
}
+ } else if (curr->is<CallImport>()) {
+ auto target = curr->cast<CallImport>()->target;
+ if (wasm.importsMap.count(target) == 0) {
+ auto import = allocator.alloc<Import>();
+ import->name = import->base = target;
+ import->module = ENV;
+ import->type = sigToFunctionType(getSig(curr));
+ wasm.addImport(import);
+ }
}
};
auto handleTyped = [&](WasmType type) {
@@ -1070,6 +1073,7 @@ public:
auto import = parent->allocator.alloc<Import>();
import->name = import->base = curr->target;
import->module = ENV;
+ import->type = sigToFunctionType(getSig(curr));
parent->wasm.addImport(import);
}
}
diff --git a/test/dot_s/asm_const.wast b/test/dot_s/asm_const.wast
index ca3624073..56d4ba58d 100644
--- a/test/dot_s/asm_const.wast
+++ b/test/dot_s/asm_const.wast
@@ -1,6 +1,6 @@
(module
(memory 51 4294967295 (segment 16 "{ Module.print(\"hello, world!\"); }\00"))
- (import $_emscripten_asm_const_vi "env" "_emscripten_asm_const_vi")
+ (import $_emscripten_asm_const_vi "env" "_emscripten_asm_const_vi" (param i32))
(export "main" $main)
(func $main (result i32)
(block $fake_return_waka123
diff --git a/test/dot_s/basics.wast b/test/dot_s/basics.wast
index eb7ec8e45..b0ae237d1 100644
--- a/test/dot_s/basics.wast
+++ b/test/dot_s/basics.wast
@@ -1,6 +1,6 @@
(module
(memory 52 4294967295 (segment 16 "hello, world!\n\00") (segment 32 "vcq") (segment 48 "\16\00\00\00"))
- (import $puts "env" "puts")
+ (import $puts "env" "puts" (param i32))
(export "main" $main)
(table $main)
(func $main (param $$0 i32) (param $$1 i32) (result i32)
diff --git a/test/dot_s/call.wast b/test/dot_s/call.wast
index 64e408ce0..27debb231 100644
--- a/test/dot_s/call.wast
+++ b/test/dot_s/call.wast
@@ -2,13 +2,13 @@
(memory 0 4294967295)
(type $FUNCSIG_v (func))
(type $FUNCSIG_i (func))
- (import $i32_nullary "env" "i32_nullary")
- (import $i64_nullary "env" "i64_nullary")
- (import $float_nullary "env" "float_nullary")
- (import $double_nullary "env" "double_nullary")
+ (import $i32_nullary "env" "i32_nullary" (result i32))
+ (import $i64_nullary "env" "i64_nullary" (result i64))
+ (import $float_nullary "env" "float_nullary" (result f32))
+ (import $double_nullary "env" "double_nullary" (result f64))
(import $void_nullary "env" "void_nullary")
- (import $i32_unary "env" "i32_unary")
- (import $i32_binary "env" "i32_binary")
+ (import $i32_unary "env" "i32_unary" (param i32) (result i32))
+ (import $i32_binary "env" "i32_binary" (param i32 i32) (result i32))
(export "call_i32_nullary" $call_i32_nullary)
(export "call_i64_nullary" $call_i64_nullary)
(export "call_float_nullary" $call_float_nullary)
diff --git a/test/dot_s/cfg-stackify.wast b/test/dot_s/cfg-stackify.wast
index 4a7128fc8..fdf438e8d 100644
--- a/test/dot_s/cfg-stackify.wast
+++ b/test/dot_s/cfg-stackify.wast
@@ -2,7 +2,7 @@
(memory 0 4294967295)
(import $something "env" "something")
(import $bar "env" "bar")
- (import $a "env" "a")
+ (import $a "env" "a" (result i32))
(export "test0" $test0)
(export "test1" $test1)
(export "test2" $test2)
diff --git a/test/dot_s/exit.wast b/test/dot_s/exit.wast
index 309aa5270..7ac114749 100644
--- a/test/dot_s/exit.wast
+++ b/test/dot_s/exit.wast
@@ -1,6 +1,6 @@
(module
(memory 0 4294967295)
- (import $exit "env" "exit")
+ (import $exit "env" "exit" (param i32))
(export "main" $main)
(func $main (result i32)
(local $$0 i32)
diff --git a/test/dot_s/f32.wast b/test/dot_s/f32.wast
index 81ee15c04..f6f5f68d1 100644
--- a/test/dot_s/f32.wast
+++ b/test/dot_s/f32.wast
@@ -1,6 +1,6 @@
(module
(memory 0 4294967295)
- (import $fmaf "env" "fmaf")
+ (import $fmaf "env" "fmaf" (param f32 f32 f32) (result f32))
(export "fadd32" $fadd32)
(export "fsub32" $fsub32)
(export "fmul32" $fmul32)
diff --git a/test/dot_s/f64.wast b/test/dot_s/f64.wast
index cb5be67e5..1177bc9e6 100644
--- a/test/dot_s/f64.wast
+++ b/test/dot_s/f64.wast
@@ -1,6 +1,6 @@
(module
(memory 0 4294967295)
- (import $fma "env" "fma")
+ (import $fma "env" "fma" (param f64 f64 f64) (result f64))
(export "fadd64" $fadd64)
(export "fsub64" $fsub64)
(export "fmul64" $fmul64)
diff --git a/test/dot_s/frem.wast b/test/dot_s/frem.wast
index bd60de20b..cd4369504 100644
--- a/test/dot_s/frem.wast
+++ b/test/dot_s/frem.wast
@@ -1,7 +1,7 @@
(module
(memory 0 4294967295)
- (import $fmodf "env" "fmodf")
- (import $fmod "env" "fmod")
+ (import $fmodf "env" "fmodf" (param f32 f32) (result f32))
+ (import $fmod "env" "fmod" (param f64 f64) (result f64))
(export "frem32" $frem32)
(export "frem64" $frem64)
(func $frem32 (param $$0 f32) (param $$1 f32) (result f32)
diff --git a/test/dot_s/global.wast b/test/dot_s/global.wast
index 087fe6415..09cf1a1a2 100644
--- a/test/dot_s/global.wast
+++ b/test/dot_s/global.wast
@@ -1,6 +1,6 @@
(module
(memory 1184 4294967295 (segment 4 "9\05\00\00") (segment 20 "\01\00\00\00") (segment 24 "*\00\00\00") (segment 28 "\ff\ff\ff\ff") (segment 56 "\00\00\00\00\00\00\00\00") (segment 64 "\ff\ff\ff\ff\ff\ff\ff\ff") (segment 84 "\00\00\00\80") (segment 88 "\00\00\00@") (segment 120 "\00\00\00\00\00\00\00\00") (segment 128 "\00\00\00\00\00\00\00\00") (segment 656 "\e0\00\00\00"))
- (import $memcpy "env" "memcpy")
+ (import $memcpy "env" "memcpy" (param i32 i32 i32))
(export "foo" $foo)
(export "call_memcpy" $call_memcpy)
(func $foo (result i32)
diff --git a/test/dot_s/legalize.wast b/test/dot_s/legalize.wast
index e6e2e9029..7614b462e 100644
--- a/test/dot_s/legalize.wast
+++ b/test/dot_s/legalize.wast
@@ -1,7 +1,7 @@
(module
(memory 0 4294967295)
- (import $__lshrti3 "env" "__lshrti3")
- (import $__ashlti3 "env" "__ashlti3")
+ (import $__lshrti3 "env" "__lshrti3" (param i32 i64 i64 i64))
+ (import $__ashlti3 "env" "__ashlti3" (param i32 i64 i64 i64))
(export "shl_i3" $shl_i3)
(export "shl_i53" $shl_i53)
(export "sext_in_reg_i32_i64" $sext_in_reg_i32_i64)
diff --git a/test/dot_s/memops.wast b/test/dot_s/memops.wast
index b4bc16cc6..6d52c1896 100644
--- a/test/dot_s/memops.wast
+++ b/test/dot_s/memops.wast
@@ -1,6 +1,6 @@
(module
(memory 67 4294967295 (segment 16 "{ Module.print(\"hello, world! \" + HEAP32[8>>2]); }\00"))
- (import $_emscripten_asm_const_vi "env" "_emscripten_asm_const_vi")
+ (import $_emscripten_asm_const_vi "env" "_emscripten_asm_const_vi" (param i32))
(export "_Z6reporti" $_Z6reporti)
(export "main" $main)
(func $_Z6reporti (param $$0 i32)
diff --git a/test/dot_s/returned.wast b/test/dot_s/returned.wast
index 60ec69e6e..8293de6b2 100644
--- a/test/dot_s/returned.wast
+++ b/test/dot_s/returned.wast
@@ -1,8 +1,8 @@
(module
(memory 0 4294967295)
- (import $_Znwm "env" "_Znwm")
- (import $_ZN5AppleC1Ev "env" "_ZN5AppleC1Ev")
- (import $memcpy "env" "memcpy")
+ (import $_Znwm "env" "_Znwm" (param i32) (result i32))
+ (import $_ZN5AppleC1Ev "env" "_ZN5AppleC1Ev" (param i32) (result i32))
+ (import $memcpy "env" "memcpy" (param i32 i32 i32) (result i32))
(export "_Z3foov" $_Z3foov)
(export "_Z3barPvS_l" $_Z3barPvS_l)
(func $_Z3foov (result i32)
diff --git a/test/dot_s/unused-argument.wast b/test/dot_s/unused-argument.wast
index 29ebad529..96c880442 100644
--- a/test/dot_s/unused-argument.wast
+++ b/test/dot_s/unused-argument.wast
@@ -1,6 +1,6 @@
(module
(memory 0 4294967295)
- (import $return_something "env" "return_something")
+ (import $return_something "env" "return_something" (result i32))
(export "unused_first" $unused_first)
(export "unused_second" $unused_second)
(export "call_something" $call_something)
diff --git a/test/dot_s/vtable.wast b/test/dot_s/vtable.wast
index a19dda119..e1d3e4066 100644
--- a/test/dot_s/vtable.wast
+++ b/test/dot_s/vtable.wast
@@ -1,6 +1,6 @@
(module
(memory 208 4294967295 (segment 16 "1A\00") (segment 32 "1B\00") (segment 48 "1C\00") (segment 64 "1D\00") (segment 68 "\00\00\00\00\98\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00") (segment 88 "\00\00\00\00\a0\00\00\00\00\00\00\00\03\00\00\00\04\00\00\00") (segment 108 "\00\00\00\00\b0\00\00\00\00\00\00\00\05\00\00\00\06\00\00\00") (segment 128 "\00\00\00\00\c0\00\00\00\00\00\00\00\07\00\00\00\08\00\00\00") (segment 152 "\00\00\00\00\10\00\00\00") (segment 160 "\00\00\00\00 \00\00\00\98\00\00\00") (segment 176 "\00\00\00\000\00\00\00\98\00\00\00") (segment 192 "\00\00\00\00@\00\00\00\a0\00\00\00") (segment 204 "\00\00\00\00"))
- (import $_ZdlPv "env" "_ZdlPv")
+ (import $_ZdlPv "env" "_ZdlPv" (param i32))
(export "_ZN1A3fooEv" $_ZN1A3fooEv)
(export "_ZN1B3fooEv" $_ZN1B3fooEv)
(export "_ZN1C3fooEv" $_ZN1C3fooEv)