diff options
author | Alon Zakai <alonzakai@gmail.com> | 2013-11-26 16:44:00 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-11-26 16:44:00 -0800 |
commit | 920974131a81ace3c026514af7aa71f89328740f (patch) | |
tree | 8009f268282b23cddb34d3fab4ee5593fc648559 | |
parent | 1288b402e48809e5addba02b8321ff77bdd25028 (diff) | |
parent | aefb4b1d6b8a5e5bdc8afba5f43eceebbaa39280 (diff) |
Merge pull request #1864 from ngld/llvm-used
Implemented #1573. (@llvm.used)
-rw-r--r-- | src/intertyper.js | 21 | ||||
-rw-r--r-- | src/modules.js | 1 | ||||
-rw-r--r-- | tests/test_core.py | 19 |
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') |