diff --git a/src/linkers/emscripten/README.md b/src/linkers/emscripten/README.md index 4d4df4c94..38ac482e0 100644 --- a/src/linkers/emscripten/README.md +++ b/src/linkers/emscripten/README.md @@ -150,7 +150,7 @@ ``` - exit - _[__syscall1](#__syscall1)_     [:top:](#emscripten-syscalls) ```rust -fn exit(error_code: usize) +fn exit(status: c_int) ``` - faccessat - _[__syscall307](#__syscall307)_     [:top:](#emscripten-syscalls) ```rust @@ -289,7 +289,7 @@ fn exit(error_code: usize) ``` - open - _[__syscall5](#__syscall5)_     [:top:](#emscripten-syscalls) ```rust -fn open(pathname: *const char, flags: usize, mode: usize) -> usize +fn open(path: *const c_char, oflag: c_int, ...) -> c_int ``` - openat - _[__syscall295](#__syscall295)_     [:top:](#emscripten-syscalls) ```rust diff --git a/src/linkers/emscripten/mod.rs b/src/linkers/emscripten/mod.rs index 64d1e4037..b269a6300 100644 --- a/src/linkers/emscripten/mod.rs +++ b/src/linkers/emscripten/mod.rs @@ -3,6 +3,7 @@ use crate::webassembly::{ImportObject, ImportValue}; mod abort; mod printf; mod putchar; +mod syscalls; pub fn generate_emscripten_env<'a, 'b>() -> ImportObject<&'a str, &'b str> { let mut import_object = ImportObject::new(); @@ -10,6 +11,10 @@ pub fn generate_emscripten_env<'a, 'b>() -> ImportObject<&'a str, &'b str> { import_object.set("env", "putchar", ImportValue::Func(putchar::putchar as *const u8)); import_object.set("env", "abort", ImportValue::Func(abort::abort as *const u8)); import_object.set("env", "_abort", ImportValue::Func(abort::abort as *const u8)); + // SYSCALLS + import_object.set("env", "__syscall1", ImportValue::Func(syscalls::__syscall1 as *const u8)); + import_object.set("env", "__syscall3", ImportValue::Func(syscalls::__syscall3 as *const u8)); + import_object.set("env", "__syscall5", ImportValue::Func(syscalls::__syscall5 as *const u8)); import_object } diff --git a/src/linkers/emscripten/syscalls/darwin/mod.rs b/src/linkers/emscripten/syscalls/darwin/mod.rs new file mode 100644 index 000000000..1d7397e2f --- /dev/null +++ b/src/linkers/emscripten/syscalls/darwin/mod.rs @@ -0,0 +1 @@ +pub mod syscalls; diff --git a/src/linkers/emscripten/syscalls/darwin/syscalls.rs b/src/linkers/emscripten/syscalls/darwin/syscalls.rs new file mode 100644 index 000000000..dc7a64ff4 --- /dev/null +++ b/src/linkers/emscripten/syscalls/darwin/syscalls.rs @@ -0,0 +1,25 @@ +use libc::{ + c_int, + c_void, + c_char, + size_t, + ssize_t, + open, + exit, + read, +}; + +/// exit +pub extern "C" fn __syscall1(status: c_int) { + unsafe { exit(status); } +} + +/// read +pub extern "C" fn __syscall3(fd: c_int, buf: *mut c_void, count: size_t) -> ssize_t { + unsafe { read(fd, buf, count) } +} + +/// open +pub extern "C" fn __syscall5(path: *const c_char, oflag: c_int) -> c_int { + unsafe { open(path, oflag) } +} diff --git a/src/linkers/emscripten/syscalls/mod.rs b/src/linkers/emscripten/syscalls/mod.rs new file mode 100644 index 000000000..8b5a6894d --- /dev/null +++ b/src/linkers/emscripten/syscalls/mod.rs @@ -0,0 +1,3 @@ +mod darwin; + +pub use self::darwin::syscalls::*;