Add tests for dyncall_so patch (#908)

This commit is contained in:
Dexter Chua 2020-12-22 11:25:07 +08:00 committed by GitHub
parent 3f9062adf7
commit 108c613a28
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 103 additions and 24 deletions

View File

@ -1,3 +1,5 @@
Tests for this are in emsdk/tests/test_dyncall.py
--- a/emsdk/fastcomp/emscripten/src/support.js
+++ b/emsdk/fastcomp/emscripten/src/support.js
@@ -338,6 +338,11 @@ function relocateExports(exports, memoryBase, tableBase, moduleLocal) {

View File

@ -16,3 +16,28 @@ env = {
"EM_CACHE": str(EMSDK / ".emscripten_cache"),
"BINARYEN_ROOT": str(EMSDK / "binaryen"),
}
MAIN_C = """
#include <stdio.h>
#include <dlfcn.h>
int main() {
puts("hello from main");
void *handle = dlopen("library.wasm", RTLD_NOW);
if (!handle) {
puts("cannot load side module");
puts(dlerror());
return 1;
}
typedef void (*type_v)();
type_v side_func = (type_v) dlsym(handle, "foo");
if (!side_func) {
puts("cannot load side function");
puts(dlerror());
return 1;
} else {
side_func();
}
return 0;
}
"""

View File

@ -0,0 +1,75 @@
import subprocess
from . import common
def test_emulate_function(tmpdir):
with tmpdir.as_cwd():
with open("library.c", "w") as f:
f.write(
"""\
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>
#include <assert.h>
// This can be any function that has a signature not found in main.
__attribute__ ((noinline)) int indirect_function(int a, float b, int c, double d) {
return a;
}
typedef int (*type_iifid) (int, float, int, double);
void foo() {
// Hack to force inclusion of malloc
volatile int x = (int) malloc(1);
free((void *) x);
type_iifid fp = &indirect_function;
jmp_buf buf;
int i = setjmp(buf);
printf("%d\\n", i);
assert(fp(i, 0, 0, 0) == i);
if (i == 0) longjmp(buf, 1);
}
"""
)
with open("main.c", "w") as f:
f.write(common.MAIN_C)
subprocess.run(
[
"emcc",
"-s",
"SIDE_MODULE=1",
"library.c",
"-o",
"library.wasm",
"-s",
"EMULATE_FUNCTION_POINTER_CASTS=1",
"-s",
"EXPORT_ALL=1",
],
check=True,
env=common.env,
)
subprocess.run(
[
"emcc",
"-s",
"MAIN_MODULE=1",
"main.c",
"--embed-file",
"library.wasm",
"-s",
"EMULATE_FUNCTION_POINTER_CASTS=1",
],
check=True,
env=common.env,
)
out = subprocess.run(
["node", "a.out.js"], capture_output=True, check=True, env=common.env
)
assert out.stdout == b"hello from main\n0\n4\n"

View File

@ -14,31 +14,8 @@ void foo() {
}"""
)
with open("main.c", "w") as f:
f.write(
"""\
#include <stdio.h>
#include <dlfcn.h>
f.write(common.MAIN_C)
int main() {
puts("hello from main");
void *f = dlopen("library.wasm", RTLD_NOW);
if (!f) {
puts("cannot load side module");
puts(dlerror());
return 1;
}
typedef void (*voidfunc)();
voidfunc g = (voidfunc) dlsym(f, "foo");
if (!g) {
puts("cannot load side function");
return 1;
} else {
g();
}
return 0;
}
"""
)
subprocess.run(
[
"emcc",