diff options
Diffstat (limited to 'emscripten.py')
-rwxr-xr-x | emscripten.py | 71 |
1 files changed, 32 insertions, 39 deletions
diff --git a/emscripten.py b/emscripten.py index 7514b3ca..42db0803 100755 --- a/emscripten.py +++ b/emscripten.py @@ -726,7 +726,6 @@ def emscript_fast(infile, settings, outfile, libraries=[], compiler_engine=None, """ assert(settings['ASM_JS']) # TODO: apply ASM_JS even in -O0 for fastcomp - assert(settings['RUNNING_JS_OPTS']) # Overview: # * Run LLVM backend to emit JS. JS includes function bodies, memory initializer, @@ -734,47 +733,20 @@ def emscript_fast(infile, settings, outfile, libraries=[], compiler_engine=None, # * Run compiler.js on the metadata to emit the shell js code, pre/post-ambles, # JS library dependencies, etc. - if DEBUG: logging.debug('emscript: llvm backend') - - # TODO: proper temp files - # TODO: use a single LLVM toolchain instead of normal for source, pnacl for simplification, custom for js backend - - if DEBUG: shutil.copyfile(infile, os.path.join(shared.CANONICAL_TEMP_DIR, 'temp0.ll')) - - if DEBUG: logging.debug(' ..1..') - temp1 = temp_files.get('.1.bc').name - shared.jsrun.timeout_run(subprocess.Popen([os.path.join(shared.LLVM_ROOT, 'opt'), infile, '-pnacl-abi-simplify-preopt', '-o', temp1])) - assert os.path.exists(temp1) - if DEBUG: - shutil.copyfile(temp1, os.path.join(shared.CANONICAL_TEMP_DIR, 'temp1.bc')) - shared.jsrun.timeout_run(subprocess.Popen([os.path.join(shared.LLVM_ROOT, 'llvm-dis'), 'temp1.bc', '-o', 'temp1.ll'])) - - #if DEBUG: logging.debug(' ..2..') - #temp2 = temp_files.get('.2.bc').name - #shared.jsrun.timeout_run(subprocess.Popen([os.path.join(shared.LLVM_ROOT, 'opt'), temp1, '-O3', '-o', temp2])) - #assert os.path.exists(temp2) - #if DEBUG: - # shutil.copyfile(temp2, os.path.join(shared.CANONICAL_TEMP_DIR, 'temp2.bc')) - # shared.jsrun.timeout_run(subprocess.Popen([os.path.join(shared.LLVM_ROOT, 'llvm-dis'), 'temp2.bc', '-o', 'temp2.ll'])) - temp2 = temp1 # XXX if we optimize the bc, we remove some pnacl clutter, but it also makes varargs stores be 8-byte aligned - - if DEBUG: logging.debug(' ..3..') - temp3 = temp_files.get('.3.bc').name - shared.jsrun.timeout_run(subprocess.Popen([os.path.join(shared.LLVM_ROOT, 'opt'), temp2, '-pnacl-abi-simplify-postopt', '-o', temp3])) - #'-print-after-all' - assert os.path.exists(temp3) if DEBUG: - shutil.copyfile(temp3, os.path.join(shared.CANONICAL_TEMP_DIR, 'temp3.bc')) - shared.jsrun.timeout_run(subprocess.Popen([os.path.join(shared.LLVM_ROOT, 'llvm-dis'), 'temp3.bc', '-o', 'temp3.ll'])) + logging.debug('emscript: llvm backend') + t = time.time() - if DEBUG: logging.debug(' ..4..') - temp4 = temp_files.get('.4.js').name + temp_js = temp_files.get('.4.js').name backend_compiler = os.path.join(shared.LLVM_ROOT, 'llc') - shared.jsrun.timeout_run(subprocess.Popen([backend_compiler, temp3, '-march=js', '-filetype=asm', '-o', temp4], stdout=subprocess.PIPE)) - if DEBUG: shutil.copyfile(temp4, os.path.join(shared.CANONICAL_TEMP_DIR, 'temp4.js')) + shared.jsrun.timeout_run(subprocess.Popen([backend_compiler, infile, '-march=js', '-filetype=asm', '-o', temp_js], stdout=subprocess.PIPE)) + + if DEBUG: + logging.debug(' emscript: llvm backend took %s seconds' % (time.time() - t)) + t = time.time() # Split up output - backend_output = open(temp4).read() + backend_output = open(temp_js).read() #if DEBUG: print >> sys.stderr, backend_output start_funcs_marker = '// EMSCRIPTEN_START_FUNCTIONS' @@ -801,6 +773,20 @@ def emscript_fast(infile, settings, outfile, libraries=[], compiler_engine=None, table_sizes[k] = str(v.count(',')) # undercounts by one, but that is what we want funcs = re.sub(r"#FM_(\w+)#", lambda m: table_sizes[m.groups(0)[0]], funcs) + # fix +float into float.0, if not running js opts + if not settings['RUNNING_JS_OPTS']: + def fix_dot_zero(m): + num = m.group(3) + # TODO: handle 0x floats? + if num.find('.') < 0: + e = num.find('e'); + if e < 0: + num += '.0' + else: + num = num[:e] + '.0' + num[e:] + return m.group(1) + m.group(2) + num + funcs = re.sub(r'([(=,+\-*/%<>:?] *)\+(-?)((0x)?[0-9a-f]*\.?[0-9]+([eE][-+]?[0-9]+)?)', lambda m: fix_dot_zero(m), funcs) + # js compiler if DEBUG: logging.debug('emscript: js compiler glue') @@ -836,7 +822,9 @@ def emscript_fast(infile, settings, outfile, libraries=[], compiler_engine=None, assert '//FORWARDED_DATA:' in out, 'Did not receive forwarded data in pre output - process failed?' glue, forwarded_data = out.split('//FORWARDED_DATA:') - #print >> sys.stderr, out + if DEBUG: + logging.debug(' emscript: glue took %s seconds' % (time.time() - t)) + t = time.time() last_forwarded_json = forwarded_json = json.loads(forwarded_data) @@ -932,7 +920,10 @@ def emscript_fast(infile, settings, outfile, libraries=[], compiler_engine=None, if item == '0': return bad if not newline else (bad + '\n') if item not in metadata['implementedFunctions']: # this is imported into asm, we must wrap it - code = item + '(' + coerced_params + ')' + call_ident = item + if call_ident in metadata['redirects']: call_ident = metadata['redirects'][call_ident] + if not call_ident.startswith('_') and not call_ident.startswith('Math_'): call_ident = '_' + call_ident + code = call_ident + '(' + coerced_params + ')' if sig[0] != 'v': code = 'return ' + shared.JS.make_coercion(code, sig[0], settings) code += ';' @@ -1203,6 +1194,8 @@ Runtime.stackRestore = function(top) { asm['stackRestore'](top) }; outfile.close() + if DEBUG: logging.debug(' emscript: final python processing took %s seconds' % (time.time() - t)) + if os.environ.get('EMCC_FAST_COMPILER'): emscript = emscript_fast |