forked from wasm3/wasm3
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathm3_api_libc.c
141 lines (104 loc) · 3.85 KB
/
m3_api_libc.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
//
// m3_api_libc.c
//
// Created by Volodymyr Shymanskyy on 11/20/19.
// Copyright © 2019 Volodymyr Shymanskyy. All rights reserved.
//
#define _POSIX_C_SOURCE 200809L
#include "m3_api_libc.h"
#include "m3_api_defs.h"
#include "m3_env.h"
#include "m3_exception.h"
#include <time.h>
#include <errno.h>
#include <stdio.h>
m3ApiRawFunction(m3_libc_abort)
{
m3ApiTrap(m3Err_trapAbort);
}
m3ApiRawFunction(m3_libc_exit)
{
m3ApiGetArg (int32_t, code)
m3ApiTrap(m3Err_trapExit);
}
m3ApiRawFunction(m3_libc_memset)
{
m3ApiReturnType (int32_t)
m3ApiGetArgMem (void*, i_ptr)
m3ApiGetArg (int32_t, i_value)
m3ApiGetArg (int32_t, i_size)
u32 result = m3ApiPtrToOffset(memset (i_ptr, i_value, i_size));
m3ApiReturn(result);
}
m3ApiRawFunction(m3_libc_memmove)
{
m3ApiReturnType (int32_t)
m3ApiGetArgMem (void*, o_dst)
m3ApiGetArgMem (void*, i_src)
m3ApiGetArg (int32_t, i_size)
u32 result = m3ApiPtrToOffset(memmove (o_dst, i_src, i_size));
m3ApiReturn(result);
}
m3ApiRawFunction(m3_libc_clock)
{
m3ApiReturnType (uint32_t)
m3ApiReturn(clock());
}
static
M3Result SuppressLookupFailure (M3Result i_result)
{
if (i_result == m3Err_functionLookupFailed)
return m3Err_none;
else
return i_result;
}
m3ApiRawFunction(m3_spectest_dummy)
{
m3ApiSuccess();
}
m3ApiRawFunction(m3_wasm3_raw_sum)
{
m3ApiReturnType (int64_t)
m3ApiGetArg (int32_t, val1)
m3ApiGetArg (int32_t, val2)
m3ApiGetArg (int32_t, val3)
m3ApiGetArg (int32_t, val4)
m3ApiReturn(val1 + val2 + val3 + val4);
m3ApiSuccess();
}
/* TODO: implement direct native function calls (using libffi?)
i64 m3_wasm3_native_sum(i32 val1, i32 val2, i32 val3, i32 val4)
{
return val1 + val2 + val3 + val4;
}
*/
M3Result m3_LinkSpecTest (IM3Module module)
{
M3Result result = m3Err_none;
const char* spectest = "spectest";
const char* wasm3 = "wasm3";
_ (SuppressLookupFailure (m3_LinkRawFunction (module, spectest, "print", "v()", &m3_spectest_dummy)));
_ (SuppressLookupFailure (m3_LinkRawFunction (module, spectest, "print_i32", "v(i)", &m3_spectest_dummy)));
_ (SuppressLookupFailure (m3_LinkRawFunction (module, spectest, "print_i64", "v(I)", &m3_spectest_dummy)));
_ (SuppressLookupFailure (m3_LinkRawFunction (module, spectest, "print_f32", "v(f)", &m3_spectest_dummy)));
_ (SuppressLookupFailure (m3_LinkRawFunction (module, spectest, "print_f64", "v(F)", &m3_spectest_dummy)));
_ (SuppressLookupFailure (m3_LinkRawFunction (module, spectest, "print_i32_f32", "v(if)", &m3_spectest_dummy)));
_ (SuppressLookupFailure (m3_LinkRawFunction (module, spectest, "print_i64_f64", "v(IF)", &m3_spectest_dummy)));
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasm3, "raw_sum", "I(iiii)", &m3_wasm3_raw_sum)));
//_ (SuppressLookupFailure (m3_LinkCFunction (module, wasm3, "native_sum", "I(iiii)", &m3_wasm3_native_sum)));
_catch:
return result;
}
M3Result m3_LinkLibC (IM3Module module)
{
M3Result result = m3Err_none;
const char* env = "env";
_ (SuppressLookupFailure (m3_LinkRawFunction (module, env, "_memset", "*(*ii)", &m3_libc_memset)));
_ (SuppressLookupFailure (m3_LinkRawFunction (module, env, "_memmove", "*(**i)", &m3_libc_memmove)));
_ (SuppressLookupFailure (m3_LinkRawFunction (module, env, "_memcpy", "*(**i)", &m3_libc_memmove))); // just alias of memmove
_ (SuppressLookupFailure (m3_LinkRawFunction (module, env, "_abort", "v()", &m3_libc_abort)));
_ (SuppressLookupFailure (m3_LinkRawFunction (module, env, "_exit", "v(i)", &m3_libc_exit)));
_ (SuppressLookupFailure (m3_LinkRawFunction (module, env, "_clock", "i()", &m3_libc_clock)));
_catch:
return result;
}