Index: runtime/wasm-runtime.cpp |
diff --git a/runtime/wasm-runtime.c b/runtime/wasm-runtime.cpp |
similarity index 80% |
rename from runtime/wasm-runtime.c |
rename to runtime/wasm-runtime.cpp |
index 2e1bd37d79734753ccbba1a801591da5e1099a66..9628d3a6f30a62b3e598c1f110e82374550c404b 100644 |
--- a/runtime/wasm-runtime.c |
+++ b/runtime/wasm-runtime.cpp |
@@ -1,4 +1,4 @@ |
-//===- subzero/runtime/wasm-runtime.c - Subzero WASM runtime source -------===// |
+//===- subzero/runtime/wasm-runtime.cpp - Subzero WASM runtime source -----===// |
// |
// The Subzero Code Generator |
// |
@@ -12,8 +12,19 @@ |
// |
//===----------------------------------------------------------------------===// |
+#include <cmath> |
+ |
+namespace env { |
+double floor(double X) { return std::floor(X); } |
+ |
+float floor(float X) { return std::floor(X); } |
+} |
+ |
+// TODO (eholk): move the C parts outside and use C++ name mangling. |
+extern "C" { |
#include <errno.h> |
#include <fcntl.h> |
+#include <math.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include <string.h> |
@@ -44,12 +55,13 @@ UNIMPLEMENTED(setjmp) |
UNIMPLEMENTED(longjmp) |
UNIMPLEMENTED(__assert_fail) |
UNIMPLEMENTED(__builtin_malloc) |
+UNIMPLEMENTED(__builtin_isinff) |
+UNIMPLEMENTED(__builtin_isinfl) |
UNIMPLEMENTED(__builtin_apply) |
UNIMPLEMENTED(__builtin_apply_args) |
UNIMPLEMENTED(pthread_cleanup_push) |
UNIMPLEMENTED(pthread_cleanup_pop) |
UNIMPLEMENTED(pthread_self) |
-UNIMPLEMENTED(abs) |
UNIMPLEMENTED(__floatditf) |
UNIMPLEMENTED(__floatsitf) |
UNIMPLEMENTED(__fixtfdi) |
@@ -66,14 +78,17 @@ UNIMPLEMENTED(__multf3) |
UNIMPLEMENTED(__multi3) |
UNIMPLEMENTED(__lock) |
UNIMPLEMENTED(__unlock) |
-UNIMPLEMENTED(__syscall6) |
-UNIMPLEMENTED(__syscall20) |
-UNIMPLEMENTED(__syscall140) |
-UNIMPLEMENTED(__syscall192) |
+UNIMPLEMENTED(__syscall6) // sys_close |
+UNIMPLEMENTED(__syscall140) // sys_llseek |
+UNIMPLEMENTED(__syscall192) // sys_mmap? |
+UNIMPLEMENTED(__unordtf2) |
+UNIMPLEMENTED(__fixunstfsi) |
+UNIMPLEMENTED(__floatunsitf) |
+UNIMPLEMENTED(__extenddftf2) |
void *wasmPtr(int Index) { |
// TODO (eholk): get the mask from the WASM file. |
- const int MASK = 0x3fffff; |
+ const int MASK = 0xffffff; |
Index &= MASK; |
return WASM_MEMORY + Index; |
@@ -86,6 +101,10 @@ extern int __szwasm_main(int, const char **); |
int main(int argc, const char **argv) { return __szwasm_main(argc, argv); } |
+int env$$abs(int a) { return abs(a); } |
+ |
+double env$$pow(double x, double y) { return pow(x, y); } |
+ |
/// sys_write |
int env$$__syscall4(int Which, int VarArgs) { |
int Fd = WASM_DEREF(int, VarArgs + 0 * sizeof(int)); |
@@ -107,6 +126,14 @@ int env$$__syscall5(int Which, int VarArgs) { |
return open(Path, Flags, Mode); |
} |
+/// sys_getpid |
+int env$$__syscall20(int Which, int VarArgs) { |
+ (void)Which; |
+ (void)VarArgs; |
+ |
+ return getpid(); |
+} |
+ |
/// sys_ioctl |
int env$$__syscall54(int A, int B) { |
int Fd = WASM_DEREF(int, B + 0 * sizeof(int)); |
@@ -116,32 +143,26 @@ int env$$__syscall54(int A, int B) { |
return -ENOTTY; |
} |
+/// sys_write |
int env$$__syscall146(int Which, int VarArgs) { |
- fprintf(stderr, "syscall146\n"); |
int Fd = WASM_DEREF(int, VarArgs); |
int Iov = WASM_DEREF(int, VarArgs + sizeof(int)); |
int Iovcnt = WASM_DEREF(int, VarArgs + 2 * sizeof(int)); |
- fprintf(stderr, " Fd=%d, Iov=%d (%p), Iovcnt=%d\n", Fd, Iov, wasmPtr(Iov), |
- Iovcnt); |
- |
int Count = 0; |
for (int I = 0; I < Iovcnt; ++I) { |
void *Ptr = WASM_REF(void, WASM_DEREF(int, Iov + I * 8)); |
int Length = WASM_DEREF(int, Iov + I * 8 + 4); |
- fprintf(stderr, " [%d] write(%d, %p, %d) = ", I, Fd, Ptr, Length); |
int Curr = write(Fd, Ptr, Length); |
- fprintf(stderr, "%d\n", Curr); |
- |
if (Curr < 0) { |
return -1; |
} |
Count += Curr; |
} |
- fprintf(stderr, " Count = %d\n", Count); |
return Count; |
} |
+} |
John
2016/04/20 20:04:59
maybe
} // end of extern "C"
Check with Jim.
Eric Holk
2016/04/20 20:25:35
Done.
|