aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2013-11-26 16:44:00 -0800
committerAlon Zakai <alonzakai@gmail.com>2013-11-26 16:44:00 -0800
commit920974131a81ace3c026514af7aa71f89328740f (patch)
tree8009f268282b23cddb34d3fab4ee5593fc648559
parent1288b402e48809e5addba02b8321ff77bdd25028 (diff)
parentaefb4b1d6b8a5e5bdc8afba5f43eceebbaa39280 (diff)
Merge pull request #1864 from ngld/llvm-used
Implemented #1573. (@llvm.used)
-rw-r--r--src/intertyper.js21
-rw-r--r--src/modules.js1
-rw-r--r--tests/test_core.py19
3 files changed, 41 insertions, 0 deletions
diff --git a/src/intertyper.js b/src/intertyper.js
index 940c677f..6d0aa751 100644
--- a/src/intertyper.js
+++ b/src/intertyper.js
@@ -524,6 +524,26 @@ function intertyper(lines, sidePass, baseLineNums) {
}
});
}
+ } else if (ident == '_llvm_used') {
+ var chunk = item.tokens[1].tokens;
+ var funcs = [];
+ var part = [];
+
+ for (var i = 0; i < chunk.length; i++) {
+ if (chunk[i].text == ',') {
+ var call = parseLLVMFunctionCall(part);
+ EXPORTED_FUNCTIONS[call.ident] = 0;
+ part = [];
+ } else {
+ part.push(chunk[i]);
+ }
+ }
+ if (part.length > 0) {
+ var call = parseLLVMFunctionCall(part);
+ EXPORTED_FUNCTIONS[call.ident] = 0;
+ }
+
+ ret.value = { intertype: 'value', ident: '0', value: '0', type: ret.type };
} else if (!external) {
if (item.tokens[1] && item.tokens[1].text != ';') {
if (item.tokens[1].text == 'c') {
@@ -538,6 +558,7 @@ function intertyper(lines, sidePass, baseLineNums) {
ret.value = { intertype: 'value', ident: '0', value: '0', type: ret.type };
}
}
+
return ret;
}
}
diff --git a/src/modules.js b/src/modules.js
index 79f494c0..29fca664 100644
--- a/src/modules.js
+++ b/src/modules.js
@@ -500,6 +500,7 @@ var PassManager = {
for (var i in data.Functions) {
Functions[i] = data.Functions[i];
}
+ EXPORTED_FUNCTIONS = data.EXPORTED_FUNCTIONS;
/*
print('\n//LOADED_DATA:' + phase + ':' + JSON.stringify({
Types: Types,
diff --git a/tests/test_core.py b/tests/test_core.py
index e683586c..ec00c0a5 100644
--- a/tests/test_core.py
+++ b/tests/test_core.py
@@ -3865,6 +3865,25 @@ Exiting setjmp function, level: 0, prev_jmp: -1
process.communicate()
assert process.returncode is 0, 'float.h should agree with our system'
+ def test_llvm_used(self):
+ src = r'''
+ #include <stdio.h>
+ #include <emscripten.h>
+
+ extern "C" {
+ EMSCRIPTEN_KEEPALIVE void foobar(int x) {
+ printf("Worked! %d\n", x);
+ }
+ }
+
+ int main() {
+ emscripten_run_script("Module['_foobar'](10)");
+ return 0;
+ }'''
+
+ Building.LLVM_OPTS = 3
+ self.do_run(src, 'Worked! 10\n')
+
def test_emscripten_api(self):
#if Settings.MICRO_OPTS or Settings.RELOOP or Building.LLVM_OPTS: return self.skip('FIXME')