summaryrefslogtreecommitdiff
path: root/emscripten.py
diff options
context:
space:
mode:
Diffstat (limited to 'emscripten.py')
-rwxr-xr-xemscripten.py61
1 files changed, 32 insertions, 29 deletions
diff --git a/emscripten.py b/emscripten.py
index 94c6b61c..e2aef648 100755
--- a/emscripten.py
+++ b/emscripten.py
@@ -455,7 +455,7 @@ def emscript(infile, settings, outfile, libraries=[], compiler_engine=None,
basic_funcs = ['abort', 'assert', 'asmPrintInt', 'asmPrintFloat'] + [m.replace('.', '_') for m in math_envs]
if settings['RESERVED_FUNCTION_POINTERS'] > 0: basic_funcs.append('jsCall')
- if settings['SAFE_HEAP']: basic_funcs += ['SAFE_HEAP_LOAD', 'SAFE_HEAP_STORE']
+ if settings['SAFE_HEAP']: basic_funcs += ['SAFE_HEAP_LOAD', 'SAFE_HEAP_STORE', 'SAFE_FT_MASK']
if settings['CHECK_HEAP_ALIGN']: basic_funcs += ['CHECK_ALIGN_2', 'CHECK_ALIGN_4', 'CHECK_ALIGN_8']
if settings['ASSERTIONS']:
basic_funcs += ['nullFunc']
@@ -584,7 +584,7 @@ var asm = (function(global, env, buffer) {
var undef = 0;
var tempInt = 0, tempBigInt = 0, tempBigIntP = 0, tempBigIntS = 0, tempBigIntR = 0.0, tempBigIntI = 0, tempBigIntD = 0, tempValue = 0, tempDouble = 0.0;
''' + ''.join(['''
- var tempRet%d = 0;''' % i for i in range(10)]) + '\n' + asm_global_funcs] + [' var tempFloat = %s;\n' % ('Math_fround(0)' if settings.get('PRECISE_F32') else '0.0')] + ['''
+ var tempRet%d = 0;''' % i for i in range(10)]) + '\n' + asm_global_funcs] + [' var tempFloat = %s;\n' % ('Math_fround(0)' if settings.get('PRECISE_F32') else '0.0')] + ([' const f0 = Math_fround(0);\n'] if settings.get('PRECISE_F32') else []) + ['''
// EMSCRIPTEN_START_FUNCS
function stackAlloc(size) {
size = size|0;
@@ -611,21 +611,21 @@ function setThrew(threw, value) {
}
function copyTempFloat(ptr) {
ptr = ptr|0;
- HEAP8[tempDoublePtr] = HEAP8[ptr];
- HEAP8[tempDoublePtr+1|0] = HEAP8[ptr+1|0];
- HEAP8[tempDoublePtr+2|0] = HEAP8[ptr+2|0];
- HEAP8[tempDoublePtr+3|0] = HEAP8[ptr+3|0];
+ HEAP8[tempDoublePtr>>0] = HEAP8[ptr>>0];
+ HEAP8[tempDoublePtr+1>>0] = HEAP8[ptr+1>>0];
+ HEAP8[tempDoublePtr+2>>0] = HEAP8[ptr+2>>0];
+ HEAP8[tempDoublePtr+3>>0] = HEAP8[ptr+3>>0];
}
function copyTempDouble(ptr) {
ptr = ptr|0;
- HEAP8[tempDoublePtr] = HEAP8[ptr];
- HEAP8[tempDoublePtr+1|0] = HEAP8[ptr+1|0];
- HEAP8[tempDoublePtr+2|0] = HEAP8[ptr+2|0];
- HEAP8[tempDoublePtr+3|0] = HEAP8[ptr+3|0];
- HEAP8[tempDoublePtr+4|0] = HEAP8[ptr+4|0];
- HEAP8[tempDoublePtr+5|0] = HEAP8[ptr+5|0];
- HEAP8[tempDoublePtr+6|0] = HEAP8[ptr+6|0];
- HEAP8[tempDoublePtr+7|0] = HEAP8[ptr+7|0];
+ HEAP8[tempDoublePtr>>0] = HEAP8[ptr>>0];
+ HEAP8[tempDoublePtr+1>>0] = HEAP8[ptr+1>>0];
+ HEAP8[tempDoublePtr+2>>0] = HEAP8[ptr+2>>0];
+ HEAP8[tempDoublePtr+3>>0] = HEAP8[ptr+3>>0];
+ HEAP8[tempDoublePtr+4>>0] = HEAP8[ptr+4>>0];
+ HEAP8[tempDoublePtr+5>>0] = HEAP8[ptr+5>>0];
+ HEAP8[tempDoublePtr+6>>0] = HEAP8[ptr+6>>0];
+ HEAP8[tempDoublePtr+7>>0] = HEAP8[ptr+7>>0];
}
''' + ''.join(['''
function setTempRet%d(value) {
@@ -754,6 +754,8 @@ def emscript_fast(infile, settings, outfile, libraries=[], compiler_engine=None,
backend_args += ['-emscripten-reserved-function-pointers=%d' % settings['RESERVED_FUNCTION_POINTERS']]
if settings['ASSERTIONS'] > 0:
backend_args += ['-emscripten-assertions=%d' % settings['ASSERTIONS']]
+ if settings['ALIASING_FUNCTION_POINTERS'] == 0:
+ backend_args += ['-emscripten-no-aliasing-function-pointers']
backend_args += ['-O' + str(settings['OPT_LEVEL'])]
if DEBUG:
logging.debug('emscript: llvm backend: ' + ' '.join(backend_args))
@@ -1009,7 +1011,7 @@ def emscript_fast(infile, settings, outfile, libraries=[], compiler_engine=None,
basic_funcs = ['abort', 'assert', 'asmPrintInt', 'asmPrintFloat'] + [m.replace('.', '_') for m in math_envs]
if settings['RESERVED_FUNCTION_POINTERS'] > 0: basic_funcs.append('jsCall')
- if settings['SAFE_HEAP']: basic_funcs += ['SAFE_HEAP_LOAD', 'SAFE_HEAP_STORE']
+ if settings['SAFE_HEAP']: basic_funcs += ['SAFE_HEAP_LOAD', 'SAFE_HEAP_STORE', 'SAFE_FT_MASK']
if settings['CHECK_HEAP_ALIGN']: basic_funcs += ['CHECK_ALIGN_2', 'CHECK_ALIGN_4', 'CHECK_ALIGN_8']
if settings['ASSERTIONS']:
if settings['ASSERTIONS'] >= 2: import difflib
@@ -1080,8 +1082,9 @@ def emscript_fast(infile, settings, outfile, libraries=[], compiler_engine=None,
}
''' % (sig, ',' if len(sig) > 1 else '', args, arg_coercions, ret))
+ ffi_args = ','.join([shared.JS.make_coercion('a' + str(i), sig[i], settings, ffi_arg=True) for i in range(1, len(sig))])
for i in range(settings['RESERVED_FUNCTION_POINTERS']):
- jsret = ('return ' if sig[0] != 'v' else '') + shared.JS.make_coercion('jsCall(%d%s%s)' % (i, ',' if coerced_args else '', coerced_args), sig[0], settings)
+ jsret = ('return ' if sig[0] != 'v' else '') + shared.JS.make_coercion('jsCall(%d%s%s)' % (i, ',' if ffi_args else '', ffi_args), sig[0], settings, ffi_result=True)
function_tables_impls.append('''
function jsCall_%s_%s(%s) {
%s
@@ -1168,7 +1171,7 @@ var asm = (function(global, env, buffer) {
var nan = +env.NaN, inf = +env.Infinity;
var tempInt = 0, tempBigInt = 0, tempBigIntP = 0, tempBigIntS = 0, tempBigIntR = 0.0, tempBigIntI = 0, tempBigIntD = 0, tempValue = 0, tempDouble = 0.0;
''' + ''.join(['''
- var tempRet%d = 0;''' % i for i in range(10)]) + '\n' + asm_global_funcs] + [' var tempFloat = %s;\n' % ('Math_fround(0)' if settings.get('PRECISE_F32') else '0.0')] + ['''
+ var tempRet%d = 0;''' % i for i in range(10)]) + '\n' + asm_global_funcs] + [' var tempFloat = %s;\n' % ('Math_fround(0)' if settings.get('PRECISE_F32') else '0.0')] + ([' const f0 = Math_fround(0);\n'] if settings.get('PRECISE_F32') else []) + ['''
// EMSCRIPTEN_START_FUNCS
function stackAlloc(size) {
size = size|0;
@@ -1195,21 +1198,21 @@ function setThrew(threw, value) {
}
function copyTempFloat(ptr) {
ptr = ptr|0;
- HEAP8[tempDoublePtr] = HEAP8[ptr];
- HEAP8[tempDoublePtr+1|0] = HEAP8[ptr+1|0];
- HEAP8[tempDoublePtr+2|0] = HEAP8[ptr+2|0];
- HEAP8[tempDoublePtr+3|0] = HEAP8[ptr+3|0];
+ HEAP8[tempDoublePtr>>0] = HEAP8[ptr>>0];
+ HEAP8[tempDoublePtr+1>>0] = HEAP8[ptr+1>>0];
+ HEAP8[tempDoublePtr+2>>0] = HEAP8[ptr+2>>0];
+ HEAP8[tempDoublePtr+3>>0] = HEAP8[ptr+3>>0];
}
function copyTempDouble(ptr) {
ptr = ptr|0;
- HEAP8[tempDoublePtr] = HEAP8[ptr];
- HEAP8[tempDoublePtr+1|0] = HEAP8[ptr+1|0];
- HEAP8[tempDoublePtr+2|0] = HEAP8[ptr+2|0];
- HEAP8[tempDoublePtr+3|0] = HEAP8[ptr+3|0];
- HEAP8[tempDoublePtr+4|0] = HEAP8[ptr+4|0];
- HEAP8[tempDoublePtr+5|0] = HEAP8[ptr+5|0];
- HEAP8[tempDoublePtr+6|0] = HEAP8[ptr+6|0];
- HEAP8[tempDoublePtr+7|0] = HEAP8[ptr+7|0];
+ HEAP8[tempDoublePtr>>0] = HEAP8[ptr>>0];
+ HEAP8[tempDoublePtr+1>>0] = HEAP8[ptr+1>>0];
+ HEAP8[tempDoublePtr+2>>0] = HEAP8[ptr+2>>0];
+ HEAP8[tempDoublePtr+3>>0] = HEAP8[ptr+3>>0];
+ HEAP8[tempDoublePtr+4>>0] = HEAP8[ptr+4>>0];
+ HEAP8[tempDoublePtr+5>>0] = HEAP8[ptr+5>>0];
+ HEAP8[tempDoublePtr+6>>0] = HEAP8[ptr+6>>0];
+ HEAP8[tempDoublePtr+7>>0] = HEAP8[ptr+7>>0];
}
function setTempRet0(value) {
value = value|0;