From f8eae091107ff9d5404155b84a8cc0bb5eec8fd1 Mon Sep 17 00:00:00 2001 From: Steve Akinyemi Date: Sun, 18 Nov 2018 16:07:04 +0100 Subject: [PATCH] Add emscripten printf example and list of emscripten syscalls --- examples/em_printf.wat | 1751 ++++++++++++++++++++++++++++++ src/linkers/emscripten/README.md | 423 ++++++++ 2 files changed, 2174 insertions(+) create mode 100644 examples/em_printf.wat create mode 100644 src/linkers/emscripten/README.md diff --git a/examples/em_printf.wat b/examples/em_printf.wat new file mode 100644 index 000000000..7044b9c33 --- /dev/null +++ b/examples/em_printf.wat @@ -0,0 +1,1751 @@ +(module + (type $t0 (func (param i32 i32 i32) (result i32))) + (type $t1 (func (param i32 i32 i32 i32) (result i32))) + (type $t2 (func (param i32 i32) (result i32))) + (type $t3 (func (param i32 i32 i32 i32 i32 i32) (result i32))) + (type $t4 (func (result i32))) + (type $t5 (func (param i32) (result i32))) + (type $t6 (func (param i32))) + (type $t7 (func (param i32 i64 i32) (result i64))) + (import "env" "__syscall3" (func $env.__syscall3 (type $t1))) + (import "env" "__syscall1" (func $env.__syscall1 (type $t2))) + (import "env" "__syscall5" (func $env.__syscall5 (type $t3))) + (func $main (export "main") (type $t4) (result i32) + i32.const 1024 + call $f9 + drop + i32.const 0) + (func $f4 (type $t5) (param $p0 i32) (result i32) + (local $l0 i32) (local $l1 i32) + get_local $p0 + i32.load offset=76 + i32.const -1073741825 + i32.and + i32.const 27 + i32.load + tee_local $l1 + i32.ne + if $I0 + get_local $p0 + i32.const 76 + i32.add + set_local $p0 + block $B1 + loop $L2 + get_local $p0 + i32.load + tee_local $l0 + i32.eqz + br_if $B1 + get_local $p0 + i32.load + get_local $l0 + i32.ne + br_if $L2 + end + get_local $p0 + get_local $l0 + i32.const 1073741824 + i32.or + i32.store + get_local $p0 + i32.load + tee_local $l0 + if $I3 + loop $L4 + i32.const 240 + get_local $p0 + i32.const 128 + get_local $l0 + call $env.__syscall3 + i32.const -38 + i32.eq + if $I5 + i32.const 240 + get_local $p0 + i32.const 0 + get_local $l0 + call $env.__syscall3 + drop + end + get_local $p0 + i32.load + tee_local $l0 + br_if $L4 + end + end + get_local $l1 + i32.const 1073741824 + i32.or + set_local $l1 + end + get_local $p0 + get_local $l1 + i32.store + i32.const 1 + set_local $l0 + end + get_local $l0) + (func $f5 (type $t6) (param $p0 i32) + (local $l0 i32) + get_local $p0 + i32.const 76 + i32.add + set_local $p0 + loop $L0 + get_local $p0 + i32.load + tee_local $l0 + get_local $p0 + i32.load + i32.ne + br_if $L0 + end + get_local $p0 + i32.const 0 + i32.store + block $B1 + get_local $l0 + i32.const 1073741824 + i32.and + i32.eqz + br_if $B1 + i32.const 240 + get_local $p0 + i32.const 129 + i32.const 1 + call $env.__syscall3 + i32.const -38 + i32.ne + br_if $B1 + i32.const 240 + get_local $p0 + i32.const 1 + i32.const 1 + call $env.__syscall3 + drop + end) + (func $f6 (type $t5) (param $p0 i32) (result i32) + (local $l0 i32) + get_local $p0 + get_local $p0 + i32.load8_u offset=74 + tee_local $l0 + i32.const -1 + i32.add + get_local $l0 + i32.or + i32.store8 offset=74 + get_local $p0 + i32.load + tee_local $l0 + i32.const 8 + i32.and + i32.eqz + if $I0 + get_local $p0 + i64.const 0 + i64.store offset=4 align=4 + get_local $p0 + get_local $p0 + i32.load offset=44 + tee_local $l0 + i32.store offset=28 + get_local $p0 + get_local $l0 + i32.store offset=20 + get_local $p0 + get_local $l0 + get_local $p0 + i32.load offset=48 + i32.add + i32.store offset=16 + i32.const 0 + return + end + get_local $p0 + get_local $l0 + i32.const 32 + i32.or + i32.store + i32.const -1) + (func $f7 (type $t1) (param $p0 i32) (param $p1 i32) (param $p2 i32) (param $p3 i32) (result i32) + (local $l0 i32) (local $l1 i32) (local $l2 i32) (local $l3 i32) (local $l4 i32) (local $l5 i32) (local $l6 i32) (local $l7 i32) + get_local $p3 + i32.load offset=76 + i32.const 0 + i32.ge_s + if $I0 + get_local $p3 + call $f4 + i32.const 0 + i32.ne + set_local $l3 + end + get_local $p2 + get_local $p1 + i32.mul + set_local $l1 + block $B1 + block $B2 + block $B3 + block $B4 + block $B5 + get_local $p3 + i32.load offset=16 + tee_local $l0 + if $I6 + get_local $l0 + get_local $p3 + i32.load offset=20 + tee_local $l4 + i32.sub + get_local $l1 + i32.ge_u + br_if $B5 + br $B3 + end + i32.const 0 + set_local $l0 + get_local $p3 + call $f6 + br_if $B2 + get_local $p3 + i32.const 16 + i32.add + i32.load + get_local $p3 + i32.load offset=20 + tee_local $l4 + i32.sub + get_local $l1 + i32.lt_u + br_if $B3 + end + block $B7 (result i32) + block $B8 + get_local $p3 + i32.load8_s offset=75 + i32.const 0 + i32.lt_s + br_if $B8 + get_local $p0 + get_local $l1 + i32.add + set_local $l7 + i32.const 0 + set_local $l0 + loop $L9 + get_local $l1 + get_local $l0 + i32.add + i32.eqz + br_if $B8 + get_local $l7 + get_local $l0 + i32.add + set_local $l5 + get_local $l0 + i32.const -1 + i32.add + tee_local $l6 + set_local $l0 + get_local $l5 + i32.const -1 + i32.add + i32.load8_u + i32.const 10 + i32.ne + br_if $L9 + end + get_local $p3 + get_local $p0 + get_local $l1 + get_local $l6 + i32.add + i32.const 1 + i32.add + tee_local $l2 + get_local $p3 + i32.load offset=36 + call_indirect (type $t0) + tee_local $l0 + get_local $l2 + i32.lt_u + br_if $B2 + get_local $l7 + get_local $l6 + i32.add + i32.const 1 + i32.add + set_local $p0 + get_local $p3 + i32.const 20 + i32.add + i32.load + set_local $l4 + get_local $l6 + i32.const -1 + i32.xor + br $B7 + end + get_local $l1 + end + set_local $l0 + get_local $l4 + get_local $p0 + get_local $l0 + call $f15 + drop + get_local $p3 + i32.const 20 + i32.add + tee_local $l5 + get_local $l5 + i32.load + get_local $l0 + i32.add + i32.store + get_local $l2 + get_local $l0 + i32.add + set_local $l0 + end + br $B2 + end + get_local $p3 + get_local $p0 + get_local $l1 + get_local $p3 + i32.load offset=36 + call_indirect (type $t0) + set_local $l0 + end + get_local $l3 + i32.eqz + br_if $B1 + get_local $p3 + call $f5 + end + get_local $l0 + get_local $l1 + i32.eq + if $I10 + get_local $p2 + i32.const 0 + get_local $p1 + select + return + end + get_local $l0 + get_local $p1 + i32.div_u) + (func $f8 (type $t2) (param $p0 i32) (param $p1 i32) (result i32) + (local $l0 i32) (local $l1 i32) (local $l2 i32) + get_global $g0 + i32.const 16 + i32.sub + tee_local $l1 + set_global $g0 + get_local $l1 + get_local $p1 + i32.store8 offset=15 + block $B0 (result i32) + block $B1 + block $B2 + get_local $p0 + i32.load offset=16 + tee_local $l0 + if $I3 + get_local $p0 + i32.load offset=20 + tee_local $l2 + get_local $l0 + i32.ge_u + br_if $B1 + br $B2 + end + i32.const -1 + tee_local $l0 + get_local $p0 + call $f6 + br_if $B0 + drop + get_local $p0 + i32.load offset=20 + tee_local $l2 + get_local $p0 + i32.const 16 + i32.add + i32.load + i32.ge_u + br_if $B1 + end + get_local $p1 + i32.const 255 + i32.and + tee_local $l0 + get_local $p0 + i32.load8_s offset=75 + i32.eq + br_if $B1 + get_local $p0 + i32.const 20 + i32.add + get_local $l2 + i32.const 1 + i32.add + i32.store + get_local $l2 + get_local $p1 + i32.store8 + get_local $l1 + i32.const 16 + i32.add + set_global $g0 + get_local $l0 + return + end + i32.const -1 + tee_local $l0 + get_local $p0 + get_local $l1 + i32.const 15 + i32.add + i32.const 1 + get_local $p0 + i32.load offset=36 + call_indirect (type $t0) + i32.const 1 + i32.ne + br_if $B0 + drop + get_local $l1 + i32.load8_u offset=15 + end + set_local $l0 + get_local $l1 + i32.const 16 + i32.add + set_global $g0 + get_local $l0) + (func $f9 (type $t5) (param $p0 i32) (result i32) + (local $l0 i32) (local $l1 i32) (local $l2 i32) + i32.const 1036 + i32.load + tee_local $l0 + i32.load offset=76 + i32.const 0 + i32.ge_s + if $I0 + get_local $l0 + call $f4 + set_local $l1 + end + block $B1 + block $B2 + i32.const -1 + i32.const 0 + get_local $p0 + call $f16 + tee_local $l2 + get_local $p0 + i32.const 1 + get_local $l2 + get_local $l0 + call $f7 + i32.ne + select + i32.const 0 + i32.ge_s + if $I3 + block $B4 + get_local $l0 + i32.load8_u offset=75 + i32.const 10 + i32.eq + br_if $B4 + get_local $l0 + i32.load offset=20 + tee_local $p0 + get_local $l0 + i32.load offset=16 + i32.ge_u + br_if $B4 + get_local $l0 + i32.const 20 + i32.add + get_local $p0 + i32.const 1 + i32.add + i32.store + get_local $p0 + i32.const 10 + i32.store8 + i32.const 0 + set_local $p0 + get_local $l1 + br_if $B2 + br $B1 + end + get_local $l0 + i32.const 10 + call $f8 + i32.const 31 + i32.shr_s + set_local $p0 + get_local $l1 + i32.eqz + br_if $B1 + br $B2 + end + i32.const -1 + set_local $p0 + get_local $l1 + i32.eqz + br_if $B1 + end + get_local $l0 + call $f5 + end + get_local $p0) + (func $f10 (type $t5) (param $p0 i32) (result i32) + get_local $p0 + i32.const -4095 + i32.ge_u + if $I0 + i32.const 31 + i32.const 0 + get_local $p0 + i32.sub + i32.store + i32.const -1 + set_local $p0 + end + get_local $p0) + (func $f11 (type $t5) (param $p0 i32) (result i32) + i32.const 6 + get_local $p0 + i32.load offset=60 + call $env.__syscall1 + call $f10) + (func $f12 (type $t0) (param $p0 i32) (param $p1 i32) (param $p2 i32) (result i32) + (local $l0 i32) (local $l1 i32) (local $l2 i32) (local $l3 i32) (local $l4 i32) (local $l5 i32) (local $l6 i32) + get_global $g0 + i32.const 16 + i32.sub + tee_local $l0 + set_global $g0 + get_local $l0 + get_local $p1 + i32.store offset=8 + get_local $l0 + get_local $p2 + i32.store offset=12 + get_local $l0 + get_local $p0 + i32.load offset=28 + tee_local $p1 + i32.store + get_local $l0 + get_local $p0 + i32.load offset=20 + get_local $p1 + i32.sub + tee_local $p1 + i32.store offset=4 + i32.const 2 + set_local $l3 + block $B0 + block $B1 + get_local $p1 + get_local $p2 + i32.add + tee_local $l4 + i32.const 146 + get_local $p0 + i32.load offset=60 + get_local $l0 + i32.const 2 + call $env.__syscall3 + call $f10 + tee_local $l1 + i32.ne + if $I2 + get_local $l0 + set_local $p1 + get_local $p0 + i32.const 60 + i32.add + set_local $l6 + loop $L3 + get_local $l1 + i32.const -1 + i32.le_s + br_if $B1 + get_local $p1 + i32.const 8 + i32.add + get_local $p1 + get_local $l1 + get_local $p1 + i32.load offset=4 + tee_local $l5 + i32.gt_u + tee_local $l2 + select + tee_local $p1 + get_local $p1 + i32.load + get_local $l1 + get_local $l5 + i32.const 0 + get_local $l2 + select + i32.sub + tee_local $l5 + i32.add + i32.store + get_local $p1 + get_local $p1 + i32.load offset=4 + get_local $l5 + i32.sub + i32.store offset=4 + get_local $l4 + get_local $l1 + i32.sub + set_local $l4 + i32.const 146 + get_local $l6 + i32.load + get_local $p1 + get_local $l3 + get_local $l2 + i32.sub + tee_local $l3 + call $env.__syscall3 + call $f10 + tee_local $l2 + set_local $l1 + get_local $l4 + get_local $l2 + i32.ne + br_if $L3 + end + end + get_local $p0 + i32.const 28 + i32.add + get_local $p0 + i32.load offset=44 + tee_local $p1 + i32.store + get_local $p0 + i32.const 20 + i32.add + get_local $p1 + i32.store + get_local $p0 + get_local $p1 + get_local $p0 + i32.load offset=48 + i32.add + i32.store offset=16 + get_local $p2 + set_local $l1 + br $B0 + end + get_local $p0 + i64.const 0 + i64.store offset=16 + i32.const 0 + set_local $l1 + get_local $p0 + i32.const 28 + i32.add + i32.const 0 + i32.store + get_local $p0 + get_local $p0 + i32.load + i32.const 32 + i32.or + i32.store + get_local $l3 + i32.const 2 + i32.eq + br_if $B0 + get_local $p1 + i32.load offset=4 + set_local $p1 + get_local $l0 + i32.const 16 + i32.add + set_global $g0 + get_local $p2 + get_local $p1 + i32.sub + return + end + get_local $l0 + i32.const 16 + i32.add + set_global $g0 + get_local $l1) + (func $f13 (type $t0) (param $p0 i32) (param $p1 i32) (param $p2 i32) (result i32) + (local $l0 i32) + get_global $g0 + i32.const 16 + i32.sub + tee_local $l0 + set_global $g0 + get_local $p0 + i32.const 1 + i32.store offset=36 + block $B0 + get_local $p0 + i32.load8_u + i32.const 64 + i32.and + br_if $B0 + i32.const 54 + get_local $p0 + i32.load offset=60 + i32.const 21523 + get_local $l0 + i32.const 8 + i32.add + call $env.__syscall3 + i32.eqz + br_if $B0 + get_local $p0 + i32.const 255 + i32.store8 offset=75 + end + get_local $p0 + get_local $p1 + get_local $p2 + call $f12 + set_local $p0 + get_local $l0 + i32.const 16 + i32.add + set_global $g0 + get_local $p0) + (func $f14 (type $t7) (param $p0 i32) (param $p1 i64) (param $p2 i32) (result i64) + (local $l0 i32) + get_global $g0 + i32.const 16 + i32.sub + tee_local $l0 + set_global $g0 + i32.const 140 + get_local $p0 + i32.load offset=60 + get_local $p1 + i64.const 32 + i64.shr_u + i32.wrap/i64 + get_local $p1 + i32.wrap/i64 + get_local $l0 + i32.const 8 + i32.add + get_local $p2 + call $env.__syscall5 + call $f10 + i32.const 0 + i32.ge_s + if $I0 + get_local $l0 + i64.load offset=8 + set_local $p1 + get_local $l0 + i32.const 16 + i32.add + set_global $g0 + get_local $p1 + return + end + get_local $l0 + i64.const -1 + i64.store offset=8 + get_local $l0 + i32.const 16 + i32.add + set_global $g0 + i64.const -1) + (func $f15 (type $t0) (param $p0 i32) (param $p1 i32) (param $p2 i32) (result i32) + (local $l0 i32) (local $l1 i32) (local $l2 i32) (local $l3 i32) (local $l4 i32) (local $l5 i32) (local $l6 i32) (local $l7 i32) + block $B0 + block $B1 + block $B2 + get_local $p2 + i32.eqz + get_local $p1 + i32.const 3 + i32.and + i32.eqz + i32.or + i32.eqz + if $I3 + get_local $p0 + set_local $l0 + block $B4 + loop $L5 + get_local $l0 + get_local $p1 + i32.load8_u + i32.store8 + get_local $p2 + i32.const -1 + i32.add + set_local $l1 + get_local $l0 + i32.const 1 + i32.add + set_local $l0 + get_local $p1 + i32.const 1 + i32.add + set_local $p1 + get_local $p2 + i32.const 1 + i32.eq + br_if $B4 + get_local $l1 + set_local $p2 + get_local $p1 + i32.const 3 + i32.and + br_if $L5 + end + end + get_local $l0 + i32.const 3 + i32.and + i32.eqz + br_if $B2 + br $B1 + end + get_local $p2 + set_local $l1 + get_local $p0 + tee_local $l0 + i32.const 3 + i32.and + br_if $B1 + end + block $B6 + block $B7 + get_local $l1 + i32.const 16 + i32.ge_u + if $I8 + get_local $l0 + get_local $l1 + i32.const -16 + i32.add + tee_local $l3 + i32.const -16 + i32.and + tee_local $l4 + i32.const 16 + i32.add + tee_local $l5 + i32.add + set_local $l2 + get_local $p1 + set_local $p2 + loop $L9 + get_local $l0 + get_local $p2 + i32.load + i32.store + get_local $l0 + i32.const 4 + i32.add + get_local $p2 + i32.const 4 + i32.add + i32.load + i32.store + get_local $l0 + i32.const 8 + i32.add + get_local $p2 + i32.const 8 + i32.add + i32.load + i32.store + get_local $l0 + i32.const 12 + i32.add + get_local $p2 + i32.const 12 + i32.add + i32.load + i32.store + get_local $l0 + i32.const 16 + i32.add + set_local $l0 + get_local $p2 + i32.const 16 + i32.add + set_local $p2 + get_local $l1 + i32.const -16 + i32.add + tee_local $l1 + i32.const 15 + i32.gt_u + br_if $L9 + end + get_local $p1 + get_local $l5 + i32.add + set_local $p1 + i32.const 8 + set_local $l0 + get_local $l3 + get_local $l4 + i32.sub + tee_local $l1 + i32.const 8 + i32.and + br_if $B7 + br $B6 + end + get_local $l0 + set_local $l2 + i32.const 8 + set_local $l0 + get_local $l1 + i32.const 8 + i32.and + i32.eqz + br_if $B6 + end + get_local $l2 + get_local $p1 + i32.load + i32.store + get_local $l2 + get_local $p1 + i32.load offset=4 + i32.store offset=4 + get_local $p1 + get_local $l0 + i32.add + set_local $p1 + get_local $l2 + get_local $l0 + i32.add + set_local $l2 + end + block $B10 + block $B11 + block $B12 + get_local $l1 + i32.const 4 + i32.and + i32.eqz + if $I13 + i32.const 2 + set_local $l0 + get_local $l1 + i32.const 2 + i32.and + br_if $B12 + br $B11 + end + get_local $l2 + get_local $p1 + i32.load + i32.store + get_local $p1 + i32.const 4 + i32.add + set_local $p1 + get_local $l2 + i32.const 4 + i32.add + set_local $l2 + i32.const 2 + set_local $l0 + get_local $l1 + i32.const 2 + i32.and + i32.eqz + br_if $B11 + end + get_local $l2 + get_local $p1 + i32.load8_u + i32.store8 + get_local $l2 + get_local $p1 + i32.load8_u offset=1 + i32.store8 offset=1 + get_local $l2 + get_local $l0 + i32.add + set_local $l2 + get_local $p1 + get_local $l0 + i32.add + set_local $p1 + get_local $l1 + i32.const 1 + i32.and + br_if $B10 + br $B0 + end + get_local $l1 + i32.const 1 + i32.and + i32.eqz + br_if $B0 + end + get_local $l2 + get_local $p1 + i32.load8_u + i32.store8 + get_local $p0 + return + end + block $B14 + block $B15 + block $B16 + block $B17 + block $B18 + block $B19 + block $B20 + block $B21 + block $B22 + block $B23 + block $B24 + block $B25 + get_local $l1 + i32.const 32 + i32.lt_u + br_if $B25 + get_local $l0 + i32.const 3 + i32.and + tee_local $p2 + i32.const 3 + i32.eq + br_if $B24 + get_local $p2 + i32.const 2 + i32.eq + br_if $B23 + get_local $p2 + i32.const 1 + i32.ne + br_if $B25 + get_local $l0 + get_local $p1 + i32.load8_u offset=1 + i32.store8 offset=1 + get_local $l0 + get_local $p1 + i32.load + tee_local $l3 + i32.store8 + get_local $l0 + get_local $p1 + i32.load8_u offset=2 + i32.store8 offset=2 + get_local $p1 + i32.const 16 + i32.add + set_local $p2 + get_local $l1 + i32.const -19 + i32.add + set_local $l5 + get_local $l1 + i32.const -3 + i32.add + set_local $l4 + get_local $l0 + i32.const 3 + i32.add + set_local $l2 + get_local $p1 + get_local $l1 + i32.const -20 + i32.add + i32.const -16 + i32.and + tee_local $l6 + i32.const 19 + i32.add + tee_local $l7 + i32.add + set_local $p1 + loop $L26 + get_local $l2 + get_local $p2 + i32.const -12 + i32.add + i32.load + tee_local $l1 + i32.const 8 + i32.shl + get_local $l3 + i32.const 24 + i32.shr_u + i32.or + i32.store + get_local $l2 + i32.const 4 + i32.add + get_local $p2 + i32.const -8 + i32.add + i32.load + tee_local $l3 + i32.const 8 + i32.shl + get_local $l1 + i32.const 24 + i32.shr_u + i32.or + i32.store + get_local $l2 + i32.const 8 + i32.add + get_local $p2 + i32.const -4 + i32.add + i32.load + tee_local $l1 + i32.const 8 + i32.shl + get_local $l3 + i32.const 24 + i32.shr_u + i32.or + i32.store + get_local $l2 + i32.const 12 + i32.add + get_local $p2 + i32.load + tee_local $l3 + i32.const 8 + i32.shl + get_local $l1 + i32.const 24 + i32.shr_u + i32.or + i32.store + get_local $l2 + i32.const 16 + i32.add + set_local $l2 + get_local $p2 + i32.const 16 + i32.add + set_local $p2 + get_local $l4 + i32.const -16 + i32.add + tee_local $l4 + i32.const 16 + i32.gt_u + br_if $L26 + end + get_local $l5 + get_local $l6 + i32.sub + set_local $l1 + get_local $l0 + get_local $l7 + i32.add + set_local $l0 + end + i32.const 16 + set_local $p2 + get_local $l1 + i32.const 16 + i32.and + br_if $B22 + br $B21 + end + get_local $l0 + get_local $p1 + i32.load + tee_local $l3 + i32.store8 + get_local $p1 + i32.const 16 + i32.add + set_local $p2 + get_local $l1 + i32.const -17 + i32.add + set_local $l5 + get_local $l1 + i32.const -1 + i32.add + set_local $l4 + get_local $l0 + i32.const 1 + i32.add + set_local $l2 + get_local $p1 + get_local $l1 + i32.const -20 + i32.add + i32.const -16 + i32.and + tee_local $l6 + i32.const 17 + i32.add + tee_local $l7 + i32.add + set_local $p1 + loop $L27 + get_local $l2 + get_local $p2 + i32.const -12 + i32.add + i32.load + tee_local $l1 + i32.const 24 + i32.shl + get_local $l3 + i32.const 8 + i32.shr_u + i32.or + i32.store + get_local $l2 + i32.const 4 + i32.add + get_local $p2 + i32.const -8 + i32.add + i32.load + tee_local $l3 + i32.const 24 + i32.shl + get_local $l1 + i32.const 8 + i32.shr_u + i32.or + i32.store + get_local $l2 + i32.const 8 + i32.add + get_local $p2 + i32.const -4 + i32.add + i32.load + tee_local $l1 + i32.const 24 + i32.shl + get_local $l3 + i32.const 8 + i32.shr_u + i32.or + i32.store + get_local $l2 + i32.const 12 + i32.add + get_local $p2 + i32.load + tee_local $l3 + i32.const 24 + i32.shl + get_local $l1 + i32.const 8 + i32.shr_u + i32.or + i32.store + get_local $l2 + i32.const 16 + i32.add + set_local $l2 + get_local $p2 + i32.const 16 + i32.add + set_local $p2 + get_local $l4 + i32.const -16 + i32.add + tee_local $l4 + i32.const 18 + i32.gt_u + br_if $L27 + end + get_local $l0 + get_local $l7 + i32.add + set_local $l0 + i32.const 16 + set_local $p2 + get_local $l5 + get_local $l6 + i32.sub + tee_local $l1 + i32.const 16 + i32.and + i32.eqz + br_if $B21 + br $B22 + end + get_local $l0 + get_local $p1 + i32.load + tee_local $l3 + i32.store8 + get_local $l0 + get_local $p1 + i32.load8_u offset=1 + i32.store8 offset=1 + get_local $p1 + i32.const 16 + i32.add + set_local $p2 + get_local $l1 + i32.const -18 + i32.add + set_local $l5 + get_local $l1 + i32.const -2 + i32.add + set_local $l4 + get_local $l0 + i32.const 2 + i32.add + set_local $l2 + get_local $p1 + get_local $l1 + i32.const -20 + i32.add + i32.const -16 + i32.and + tee_local $l6 + i32.const 18 + i32.add + tee_local $l7 + i32.add + set_local $p1 + loop $L28 + get_local $l2 + get_local $p2 + i32.const -12 + i32.add + i32.load + tee_local $l1 + i32.const 16 + i32.shl + get_local $l3 + i32.const 16 + i32.shr_u + i32.or + i32.store + get_local $l2 + i32.const 4 + i32.add + get_local $p2 + i32.const -8 + i32.add + i32.load + tee_local $l3 + i32.const 16 + i32.shl + get_local $l1 + i32.const 16 + i32.shr_u + i32.or + i32.store + get_local $l2 + i32.const 8 + i32.add + get_local $p2 + i32.const -4 + i32.add + i32.load + tee_local $l1 + i32.const 16 + i32.shl + get_local $l3 + i32.const 16 + i32.shr_u + i32.or + i32.store + get_local $l2 + i32.const 12 + i32.add + get_local $p2 + i32.load + tee_local $l3 + i32.const 16 + i32.shl + get_local $l1 + i32.const 16 + i32.shr_u + i32.or + i32.store + get_local $l2 + i32.const 16 + i32.add + set_local $l2 + get_local $p2 + i32.const 16 + i32.add + set_local $p2 + get_local $l4 + i32.const -16 + i32.add + tee_local $l4 + i32.const 17 + i32.gt_u + br_if $L28 + end + get_local $l0 + get_local $l7 + i32.add + set_local $l0 + i32.const 16 + set_local $p2 + get_local $l5 + get_local $l6 + i32.sub + tee_local $l1 + i32.const 16 + i32.and + i32.eqz + br_if $B21 + end + get_local $l0 + get_local $p1 + i32.load8_u offset=1 + i32.store8 offset=1 + get_local $l0 + get_local $p1 + i32.load8_u offset=2 + i32.store8 offset=2 + get_local $l0 + get_local $p1 + i32.load8_u offset=3 + i32.store8 offset=3 + get_local $l0 + get_local $p1 + i32.load8_u offset=4 + i32.store8 offset=4 + get_local $l0 + get_local $p1 + i32.load8_u offset=5 + i32.store8 offset=5 + get_local $l0 + get_local $p1 + i32.load8_u offset=6 + i32.store8 offset=6 + get_local $l0 + get_local $p1 + i32.load8_u offset=7 + i32.store8 offset=7 + get_local $l0 + get_local $p1 + i32.load8_u offset=8 + i32.store8 offset=8 + get_local $l0 + get_local $p1 + i32.load8_u offset=9 + i32.store8 offset=9 + get_local $l0 + get_local $p1 + i32.load8_u offset=10 + i32.store8 offset=10 + get_local $l0 + get_local $p1 + i32.load8_u offset=11 + i32.store8 offset=11 + get_local $l0 + get_local $p1 + i32.load8_u offset=12 + i32.store8 offset=12 + get_local $l0 + get_local $p1 + i32.load8_u offset=13 + i32.store8 offset=13 + get_local $l0 + get_local $p1 + i32.load8_u offset=14 + i32.store8 offset=14 + get_local $l0 + get_local $p1 + i32.load8_u + i32.store8 + get_local $l0 + get_local $p1 + i32.load8_u offset=15 + i32.store8 offset=15 + get_local $l0 + get_local $p2 + i32.add + set_local $l0 + get_local $p1 + get_local $p2 + i32.add + set_local $p1 + i32.const 8 + set_local $p2 + get_local $l1 + i32.const 8 + i32.and + i32.eqz + br_if $B20 + br $B19 + end + i32.const 8 + set_local $p2 + get_local $l1 + i32.const 8 + i32.and + br_if $B19 + end + i32.const 4 + set_local $p2 + get_local $l1 + i32.const 4 + i32.and + br_if $B18 + br $B17 + end + get_local $l0 + get_local $p1 + i32.load8_u + i32.store8 + get_local $l0 + get_local $p1 + i32.load8_u offset=1 + i32.store8 offset=1 + get_local $l0 + get_local $p1 + i32.load8_u offset=2 + i32.store8 offset=2 + get_local $l0 + get_local $p1 + i32.load8_u offset=3 + i32.store8 offset=3 + get_local $l0 + get_local $p1 + i32.load8_u offset=4 + i32.store8 offset=4 + get_local $l0 + get_local $p1 + i32.load8_u offset=5 + i32.store8 offset=5 + get_local $l0 + get_local $p1 + i32.load8_u offset=6 + i32.store8 offset=6 + get_local $l0 + get_local $p1 + i32.load8_u offset=7 + i32.store8 offset=7 + get_local $l0 + get_local $p2 + i32.add + set_local $l0 + get_local $p1 + get_local $p2 + i32.add + set_local $p1 + i32.const 4 + set_local $p2 + get_local $l1 + i32.const 4 + i32.and + i32.eqz + br_if $B17 + end + get_local $l0 + get_local $p1 + i32.load8_u + i32.store8 + get_local $l0 + get_local $p1 + i32.load8_u offset=1 + i32.store8 offset=1 + get_local $l0 + get_local $p1 + i32.load8_u offset=2 + i32.store8 offset=2 + get_local $l0 + get_local $p1 + i32.load8_u offset=3 + i32.store8 offset=3 + get_local $l0 + get_local $p2 + i32.add + set_local $l0 + get_local $p1 + get_local $p2 + i32.add + set_local $p1 + i32.const 2 + set_local $p2 + get_local $l1 + i32.const 2 + i32.and + i32.eqz + br_if $B16 + br $B15 + end + i32.const 2 + set_local $p2 + get_local $l1 + i32.const 2 + i32.and + br_if $B15 + end + get_local $l1 + i32.const 1 + i32.and + br_if $B14 + br $B0 + end + get_local $l0 + get_local $p1 + i32.load8_u + i32.store8 + get_local $l0 + get_local $p1 + i32.load8_u offset=1 + i32.store8 offset=1 + get_local $l0 + get_local $p2 + i32.add + set_local $l0 + get_local $p1 + get_local $p2 + i32.add + set_local $p1 + get_local $l1 + i32.const 1 + i32.and + i32.eqz + br_if $B0 + end + get_local $l0 + get_local $p1 + i32.load8_u + i32.store8 + end + get_local $p0) + (func $f16 (type $t5) (param $p0 i32) (result i32) + (local $l0 i32) (local $l1 i32) (local $l2 i32) + block $B0 + block $B1 + block $B2 + get_local $p0 + tee_local $l0 + i32.const 3 + i32.and + i32.eqz + br_if $B2 + get_local $p0 + i32.load8_u + i32.eqz + br_if $B1 + get_local $p0 + i32.const 1 + i32.add + set_local $l0 + loop $L3 + get_local $l0 + i32.const 3 + i32.and + i32.eqz + br_if $B2 + get_local $l0 + i32.load8_u + set_local $l1 + get_local $l0 + i32.const 1 + i32.add + tee_local $l2 + set_local $l0 + get_local $l1 + br_if $L3 + end + get_local $l2 + i32.const -1 + i32.add + get_local $p0 + i32.sub + return + end + get_local $l0 + i32.const -4 + i32.add + set_local $l0 + loop $L4 + get_local $l0 + i32.const 4 + i32.add + tee_local $l0 + i32.load + tee_local $l1 + i32.const -1 + i32.xor + get_local $l1 + i32.const -16843009 + i32.add + i32.and + i32.const -2139062144 + i32.and + i32.eqz + br_if $L4 + end + get_local $l1 + i32.const 255 + i32.and + i32.eqz + br_if $B0 + loop $L5 + get_local $l0 + i32.load8_u offset=1 + set_local $l1 + get_local $l0 + i32.const 1 + i32.add + tee_local $l2 + set_local $l0 + get_local $l1 + br_if $L5 + end + get_local $l2 + get_local $p0 + i32.sub + return + end + i32.const 0 + return + end + get_local $l0 + get_local $p0 + i32.sub) + (table $T0 5 5 anyfunc) + (memory $memory (export "memory") 2) + (global $g0 (mut i32) (i32.const 67760)) + (global $__heap_base (export "__heap_base") i32 (i32.const 67760)) + (global $__data_end (export "__data_end") i32 (i32.const 2216)) + (elem (i32.const 1) $f12 $f11 $f13 $f14) + (data (i32.const 1024) "Hello World\00\10\04") + (data (i32.const 1040) "\05") + (data (i32.const 1052) "\02") + (data (i32.const 1076) "\03\00\00\00\04\00\00\00\a8\04\00\00\00\04") + (data (i32.const 1100) "\01") + (data (i32.const 1115) "\0a\ff\ff\ff\ff")) + diff --git a/src/linkers/emscripten/README.md b/src/linkers/emscripten/README.md new file mode 100644 index 000000000..f37559d0f --- /dev/null +++ b/src/linkers/emscripten/README.md @@ -0,0 +1,423 @@ +### EMSCRIPTEN SYSCALLS +- [ ] __syscall1 - _[exit](#exit)_ +- [ ] __syscall3 - _[read](#read)_ +- [ ] __syscall4 - _[write](#write)_ +- [ ] __syscall5 - _[open](#open)_ +- [ ] __syscall6 - _[close](#close)_ +- [ ] __syscall9 - _[link](#link)_ +- [ ] __syscall10 - _[unlink](#unlink)_ +- [ ] __syscall12 - _[chdir](#chdir)_ +- [ ] __syscall14 - _[mknod](#mknod)_ +- [ ] __syscall15 - _[chmod](#chmod)_ +- [ ] __syscall20 - _[getpid](#getpid)_ +- [ ] __syscall29 - _[pause](#pause)_ +- [ ] __syscall33 - _[access](#access)_ +- [ ] __syscall34 - _[nice](#nice)_ +- [ ] __syscall36 - _[sync](#sync)_ +- [ ] __syscall38 - _[rename](#rename)_ +- [ ] __syscall39 - _[mkdir](#mkdir)_ +- [ ] __syscall40 - _[rmdir](#rmdir)_ +- [ ] __syscall41 - _[dup](#dup)_ +- [ ] __syscall42 - _[pipe](#pipe)_ +- [ ] __syscall51 - _[acct](#acct)_ +- [ ] __syscall54 - _[ioctl](#ioctl)_ +- [ ] __syscall57 - _[setpgid](#setpgid)_ +- [ ] __syscall60 - _[umask](#umask)_ +- [ ] __syscall63 - _[dup](#dup)_ +- [ ] __syscall64 - _[getppid](#getppid)_ +- [ ] __syscall65 - _[getpgrp](#getpgrp)_ +- [ ] __syscall66 - _[setsid](#setsid)_ +- [ ] __syscall75 - _[setrlimit](#setrlimit)_ +- [ ] __syscall77 - _[getrusage](#getrusage)_ +- [ ] __syscall83 - _[symlink](#symlink)_ +- [ ] __syscall85 - _[readlink](#readlink)_ +- [ ] __syscall91 - _[munmap](#munmap)_ +- [ ] __syscall94 - _[fchmod](#fchmod)_ +- [ ] __syscall96 - _[getpriority](#getpriority)_ +- [ ] __syscall97 - _[setpriority](#setpriority)_ +- [ ] __syscall102 - _[socketcall](#socketcall)_ +- [ ] __syscall104 - _[setitimer](#setitimer)_ +- [ ] __syscall114 - _[wait](#wait)_ +- [ ] __syscall118 - _[fsync](#fsync)_ +- [ ] __syscall121 - _[setdomainname](#setdomainname)_ +- [ ] __syscall122 - _[uname](#uname)_ +- [ ] __syscall125 - _[mprotect](#mprotect)_ +- [ ] __syscall132 - _[getpgid](#getpgid)_ +- [ ] __syscall133 - _[fchdir](#fchdir)_ +- [ ] __syscall140 - _[llseek](#llseek)_ +- [ ] __syscall142 - _[newselect](#newselect)_ +- [ ] __syscall144 - _[msync](#msync)_ +- [ ] __syscall145 - _[readv](#readv)_ +- [ ] __syscall146 - _[writev](#writev)_ +- [ ] __syscall147 - _[getsid](#getsid)_ +- [ ] __syscall148 - _[fdatasync](#fdatasync)_ +- [ ] __syscall153 - _[munlockall](#munlockall)_ +- [ ] __syscall163 - _[mremap](#mremap)_ +- [ ] __syscall168 - _[poll](#poll)_ +- [ ] __syscall178 - _[rt_sigqueueinfo](#rt_sigqueueinfo)_ +- [ ] __syscall180 - _[pread](#pread)_ +- [ ] __syscall181 - _[pwrite](#pwrite)_ +- [ ] __syscall183 - _[getcwd](#getcwd)_ +- [ ] __syscall191 - _[ugetrlimit](#ugetrlimit)_ +- [ ] __syscall192 - _[mmap](#mmap)_ +- [ ] __syscall193 - _[truncate](#truncate)_ +- [ ] __syscall194 - _[ftruncate](#ftruncate)_ +- [ ] __syscall195 - _[SYS_stat](#SYS_stat)_ +- [ ] __syscall196 - _[SYS_lstat](#SYS_lstat)_ +- [ ] __syscall197 - _[SYS_fstat](#SYS_fstat)_ +- [ ] __syscall198 - _[lchown](#lchown)_ +- [ ] __syscall202 - _[getgid](#getgid)_ +- [ ] __syscall207 - _[fchown](#fchown)_ +- [ ] __syscall212 - _[chown](#chown)_ +- [ ] __syscall214 - _[setgid](#setgid)_ +- [ ] __syscall205 - _[getgroups](#getgroups)_ +- [ ] __syscall210 - _[setresgid](#setresgid)_ +- [ ] __syscall211 - _[getresgid](#getresgid)_ +- [ ] __syscall218 - _[mincore](#mincore)_ +- [ ] __syscall219 - _[madvise](#madvise)_ +- [ ] __syscall220 - _[SYS_getdents](#SYS_getdents)_ +- [ ] __syscall221 - _[fcntl](#fcntl)_ +- [ ] __syscall265 - _[clock_nanosleep](#clock_nanosleep)_ +- [ ] __syscall268 - _[statfs](#statfs)_ +- [ ] __syscall269 - _[fstatfs](#fstatfs)_ +- [ ] __syscall272 - _[fadvise](#fadvise)_ +- [ ] __syscall295 - _[openat](#openat)_ +- [ ] __syscall296 - _[mkdirat](#mkdirat)_ +- [ ] __syscall297 - _[mknodat](#mknodat)_ +- [ ] __syscall298 - _[fchownat](#fchownat)_ +- [ ] __syscall299 - _[futimesat](#futimesat)_ +- [ ] __syscall300 - _[fstatat](#fstatat)_ +- [ ] __syscall301 - _[unlinkat](#unlinkat)_ +- [ ] __syscall302 - _[renameat](#renameat)_ +- [ ] __syscall303 - _[linkat](#linkat)_ +- [ ] __syscall304 - _[symlinkat](#symlinkat)_ +- [ ] __syscall305 - _[readlinkat](#readlinkat)_ +- [ ] __syscall306 - _[fchmodat](#fchmodat)_ +- [ ] __syscall307 - _[faccessat](#faccessat)_ +- [ ] __syscall308 - _[pselect](#pselect)_ +- [ ] __syscall320 - _[utimensat](#utimensat)_ +- [ ] __syscall324 - _[fallocate](#fallocate)_ +- [ ] __syscall330 - _[dup](#dup)_ +- [ ] __syscall331 - _[pipe](#pipe)_ +- [ ] __syscall333 - _[preadv](#preadv)_ +- [ ] __syscall334 - _[pwritev](#pwritev)_ +- [ ] __syscall337 - _[recvmmsg](#recvmmsg)_ +- [ ] __syscall340 - _[prlimit](#prlimit)_ +- [ ] __syscall345 - _[sendmmsg](#sendmmsg)_ + +### SYSCALL NAMES +- SYS_fstat - _[__syscall197](#__syscall197)_ +```c +``` +- SYS_getdents - _[__syscall220](#__syscall220)_ +```c +``` +- SYS_lstat - _[__syscall196](#__syscall196)_ +```c +``` +- SYS_stat - _[__syscall195](#__syscall195)_ +```c +``` +- access - _[__syscall33](#__syscall33)_ +```c +``` +- acct - _[__syscall51](#__syscall51)_ +```c +``` +- chdir - _[__syscall12](#__syscall12)_ +```c +``` +- chmod - _[__syscall15](#__syscall15)_ +```c +``` +- chown - _[__syscall212](#__syscall212)_ +```c +``` +- clock_nanosleep - _[__syscall265](#__syscall265)_ +```c +``` +- close - _[__syscall6](#__syscall6)_ +```c +``` +- dup - _[__syscall330](#__syscall330)_ +```c +``` +- dup - _[__syscall41](#__syscall41)_ +```c +``` +- dup - _[__syscall63](#__syscall63)_ +```c +``` +- exit - _[__syscall1](#__syscall1)_ +```c +``` +- faccessat - _[__syscall307](#__syscall307)_ +```c +``` +- fadvise - _[__syscall272](#__syscall272)_ +```c +``` +- fallocate - _[__syscall324](#__syscall324)_ +```c +``` +- fchdir - _[__syscall133](#__syscall133)_ +```c +``` +- fchmod - _[__syscall94](#__syscall94)_ +```c +``` +- fchmodat - _[__syscall306](#__syscall306)_ +```c +``` +- fchown - _[__syscall207](#__syscall207)_ +```c +``` +- fchownat - _[__syscall298](#__syscall298)_ +```c +``` +- fcntl - _[__syscall221](#__syscall221)_ +```c +``` +- fdatasync - _[__syscall148](#__syscall148)_ +```c +``` +- fstatat - _[__syscall300](#__syscall300)_ +```c +``` +- fstatfs - _[__syscall269](#__syscall269)_ +```c +``` +- fsync - _[__syscall118](#__syscall118)_ +```c +``` +- ftruncate - _[__syscall194](#__syscall194)_ +```c +``` +- futimesat - _[__syscall299](#__syscall299)_ +```c +``` +- getcwd - _[__syscall183](#__syscall183)_ +```c +``` +- getgid - _[__syscall202](#__syscall202)_ +```c +``` +- getgroups - _[__syscall205](#__syscall205)_ +```c +``` +- getpgid - _[__syscall132](#__syscall132)_ +```c +``` +- getpgrp - _[__syscall65](#__syscall65)_ +```c +``` +- getpid - _[__syscall20](#__syscall20)_ +```c +``` +- getppid - _[__syscall64](#__syscall64)_ +```c +``` +- getpriority - _[__syscall96](#__syscall96)_ +```c +``` +- getresgid - _[__syscall211](#__syscall211)_ +```c +``` +- getrusage - _[__syscall77](#__syscall77)_ +```c +``` +- getsid - _[__syscall147](#__syscall147)_ +```c +``` +- ioctl - _[__syscall54](#__syscall54)_ +```c +``` +- lchown - _[__syscall198](#__syscall198)_ +```c +``` +- link - _[__syscall9](#__syscall9)_ +```c +``` +- linkat - _[__syscall303](#__syscall303)_ +```c +``` +- llseek - _[__syscall140](#__syscall140)_ +```c +``` +- madvise - _[__syscall219](#__syscall219)_ +```c +``` +- mincore - _[__syscall218](#__syscall218)_ +```c +``` +- mkdir - _[__syscall39](#__syscall39)_ +```c +``` +- mkdirat - _[__syscall296](#__syscall296)_ +```c +``` +- mknod - _[__syscall14](#__syscall14)_ +```c +``` +- mknodat - _[__syscall297](#__syscall297)_ +```c +``` +- mmap - _[__syscall192](#__syscall192)_ +```c +``` +- mprotect - _[__syscall125](#__syscall125)_ +```c +``` +- mremap - _[__syscall163](#__syscall163)_ +```c +``` +- msync - _[__syscall144](#__syscall144)_ +```c +``` +- munlockall - _[__syscall153](#__syscall153)_ +```c +``` +- munmap - _[__syscall91](#__syscall91)_ +```c +``` +- newselect - _[__syscall142](#__syscall142)_ +```c +``` +- nice - _[__syscall34](#__syscall34)_ +```c +``` +- open - _[__syscall5](#__syscall5)_ +```c +``` +- openat - _[__syscall295](#__syscall295)_ +```c +``` +- pause - _[__syscall29](#__syscall29)_ +```c +``` +- pipe - _[__syscall331](#__syscall331)_ +```c +``` +- pipe - _[__syscall42](#__syscall42)_ +```c +``` +- poll - _[__syscall168](#__syscall168)_ +```c +``` +- pread - _[__syscall180](#__syscall180)_ +```c +``` +- preadv - _[__syscall333](#__syscall333)_ +```c +``` +- prlimit - _[__syscall340](#__syscall340)_ +```c +``` +- pselect - _[__syscall308](#__syscall308)_ +```c +``` +- pwrite - _[__syscall181](#__syscall181)_ +```c +``` +- pwritev - _[__syscall334](#__syscall334)_ +```c +``` +- read - _[__syscall3](#__syscall3)_ +```c +``` +- readlink - _[__syscall85](#__syscall85)_ +```c +``` +- readlinkat - _[__syscall305](#__syscall305)_ +```c +``` +- readv - _[__syscall145](#__syscall145)_ +```c +``` +- recvmmsg - _[__syscall337](#__syscall337)_ +```c +``` +- rename - _[__syscall38](#__syscall38)_ +```c +``` +- renameat - _[__syscall302](#__syscall302)_ +```c +``` +- rmdir - _[__syscall40](#__syscall40)_ +```c +``` +- rt_sigqueueinfo - _[__syscall178](#__syscall178)_ +```c +``` +- sendmmsg - _[__syscall345](#__syscall345)_ +```c +``` +- setdomainname - _[__syscall121](#__syscall121)_ +```c +``` +- setgid - _[__syscall214](#__syscall214)_ +```c +``` +- setitimer - _[__syscall104](#__syscall104)_ +```c +``` +- setpgid - _[__syscall57](#__syscall57)_ +```c +``` +- setpriority - _[__syscall97](#__syscall97)_ +```c +``` +- setresgid - _[__syscall210](#__syscall210)_ +```c +``` +- setrlimit - _[__syscall75](#__syscall75)_ +```c +``` +- setsid - _[__syscall66](#__syscall66)_ +```c +``` +- socketcall - _[__syscall102](#__syscall102)_ +```c +``` +- statfs - _[__syscall268](#__syscall268)_ +```c +``` +- symlink - _[__syscall83](#__syscall83)_ +```c +``` +- symlinkat - _[__syscall304](#__syscall304)_ +```c +``` +- sync - _[__syscall36](#__syscall36)_ +```c +``` +- truncate - _[__syscall193](#__syscall193)_ +```c +``` +- ugetrlimit - _[__syscall191](#__syscall191)_ +```c +``` +- umask - _[__syscall60](#__syscall60)_ +```c +``` +- uname - _[__syscall122](#__syscall122)_ +```c +``` +- unlink - _[__syscall10](#__syscall10)_ +```c +``` +- unlinkat - _[__syscall301](#__syscall301)_ +```c +``` +- utimensat - _[__syscall320](#__syscall320)_ +```c +``` +- wait - _[__syscall114](#__syscall114)_ +```c +``` +- write - _[__syscall4](#__syscall4)_ +```c +``` +- writev - _[__syscall146](#__syscall146)_ +```c +```