aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--AUTHORS6
-rwxr-xr-xemar2
-rwxr-xr-xemcc204
-rwxr-xr-xemscripten.py39
-rw-r--r--src/analyzer.js7
-rw-r--r--src/compiler.js10
-rw-r--r--src/corruptionCheck.js98
-rw-r--r--src/intertyper.js2
-rw-r--r--src/jsifier.js61
-rw-r--r--src/library.js149
-rw-r--r--src/library_browser.js17
-rw-r--r--src/library_egl.js41
-rw-r--r--src/library_gc.js2
-rw-r--r--src/library_gl.js517
-rw-r--r--src/library_glut.js6
-rw-r--r--src/library_sdl.js41
-rw-r--r--src/modules.js22
-rw-r--r--src/parseTools.js103
-rw-r--r--src/preamble.js221
-rw-r--r--src/runtime.js27
-rw-r--r--src/settings.js50
-rw-r--r--src/shell.html2
-rw-r--r--system/lib/libc.symbols5
-rw-r--r--system/lib/libcxx/symbols9
-rw-r--r--system/lib/libcxxabi/symbols7
-rw-r--r--tests/aniso.c5
-rw-r--r--tests/aniso.pngbin35041 -> 26812 bytes
-rw-r--r--tests/bullet/output3.txt270
-rw-r--r--tests/cases/atomicrmw.ll1
-rw-r--r--tests/cases/breakinthemiddle2.ll35
-rw-r--r--tests/cases/callalias.ll21
-rw-r--r--tests/cases/callalias2.ll22
-rw-r--r--tests/cases/cmpxchg_volatile.ll548
-rw-r--r--tests/cases/inttoptrfloat.ll19
-rw-r--r--tests/cases/udiv.ll19
-rw-r--r--tests/cubegeom.c18
-rw-r--r--tests/cubegeom_pre2_vao.c380
-rw-r--r--tests/cubegeom_pre2_vao2.c381
-rw-r--r--tests/cubegeom_pre_vao.c333
-rw-r--r--tests/float_tex.pngbin19944 -> 18869 bytes
-rw-r--r--tests/fuzz/1.c117
-rw-r--r--tests/fuzz/1.c.txt1
-rw-r--r--tests/fuzz/2.c2006
-rw-r--r--tests/fuzz/2.c.txt1
-rw-r--r--tests/fuzz/3.c1043
-rw-r--r--tests/fuzz/3.c.txt1
-rw-r--r--tests/fuzz/4.c216
-rw-r--r--tests/fuzz/4.c.txt1
-rw-r--r--tests/fuzz/5.c13
-rw-r--r--tests/fuzz/5.c.txt101
-rw-r--r--tests/fuzz/7.c852
-rw-r--r--tests/fuzz/7.c.txt1
-rwxr-xr-xtests/fuzz/creduce_tester.py53
-rw-r--r--tests/fuzz/csmith.h130
-rwxr-xr-xtests/fuzz/csmith_driver.py117
-rw-r--r--tests/fuzz/platform_generic.h132
-rw-r--r--tests/fuzz/random_inc.h129
-rw-r--r--tests/fuzz/safe_math.h947
-rw-r--r--tests/gears.pngbin7832 -> 6407 bytes
-rw-r--r--tests/gl_ps.c3
-rw-r--r--tests/gl_ps.pngbin203535 -> 202598 bytes
-rw-r--r--tests/gl_ps_workaround2.c230
-rw-r--r--tests/glbook/CH13_ParticleSystem.pngbin5106 -> 4921 bytes
-rw-r--r--tests/glbook/Chapter_13/ParticleSystem/ParticleSystem_orig.c48
-rw-r--r--tests/glbook/Chapter_2/Hello_Triangle/Hello_Triangle_orig.c2
-rw-r--r--tests/glbook/Chapter_9/TextureWrap/TextureWrap_orig.c2
-rwxr-xr-xtests/runner.py641
-rw-r--r--tests/s3tc_crunch.pngbin353677 -> 271258 bytes
-rw-r--r--tests/screenshot-fog-density.pngbin154012 -> 157048 bytes
-rw-r--r--tests/screenshot-fog-exp2.pngbin119847 -> 122164 bytes
-rw-r--r--tests/screenshot-fog-linear.pngbin247928 -> 250343 bytes
-rw-r--r--tests/screenshot-fog-negative.pngbin79537 -> 80704 bytes
-rw-r--r--tests/screenshot-fog-simple.pngbin36557 -> 37940 bytes
-rw-r--r--tests/screenshot-gray-purple.pngbin242425 -> 241235 bytes
-rw-r--r--tests/screenshot-gray.pngbin203336 -> 202044 bytes
-rw-r--r--tests/sdl_gl_read.c9
-rw-r--r--tests/sdl_image_jpeg.c45
-rw-r--r--tests/sdl_text.c40
-rw-r--r--tests/websockets.c7
-rw-r--r--tools/autodebugger_c.py10
-rw-r--r--tools/file_packager.py2
-rw-r--r--tools/js-optimizer.js2
-rw-r--r--tools/js_optimizer.py23
-rw-r--r--tools/shared.py142
-rw-r--r--tools/test-js-optimizer-regs-output.js4
-rw-r--r--tools/test-js-optimizer-regs.js6
86 files changed, 10072 insertions, 705 deletions
diff --git a/AUTHORS b/AUTHORS
index 74efb628..296d4150 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -48,6 +48,8 @@ a license to everyone to use it as detailed in LICENSE.)
* Jasper St. Pierre <jstpierre@mecheye.net>
* Manuel Schölling <manuel.schoelling@gmx.de>
* Bruce Mitchener, Jr. <bruce.mitchener@gmail.com>
-
-
+* Michael Bishop <mbtyke@gmail.com>
+* Roger Braun <roger@rogerbraun.net>
+* Vladimir Vukicevic <vladimir@pobox.com> (copyright owned by Mozilla Foundation)
+* Lorant Pinter <lorant.pinter@prezi.com>
diff --git a/emar b/emar
index 60498b8f..5646f444 100755
--- a/emar
+++ b/emar
@@ -11,6 +11,8 @@ import os, subprocess, sys
from tools import shared
DEBUG = os.environ.get('EMCC_DEBUG')
+if DEBUG == "0":
+ DEBUG = None
newargs = [shared.LLVM_AR] + sys.argv[1:]
diff --git a/emcc b/emcc
index ffce7363..30074540 100755
--- a/emcc
+++ b/emcc
@@ -1,4 +1,5 @@
#!/usr/bin/env python2
+# -*- Mode: python -*-
'''
emcc - compiler helper script
@@ -90,7 +91,10 @@ LLVM_OPT_LEVEL = {
3: 3,
}
-DEBUG = int(os.environ.get('EMCC_DEBUG') or 0)
+DEBUG = os.environ.get('EMCC_DEBUG')
+if DEBUG == "0":
+ DEBUG = None
+
TEMP_DIR = os.environ.get('EMCC_TEMP_DIR')
LEAVE_INPUTS_RAW = os.environ.get('EMCC_LEAVE_INPUTS_RAW') # Do not compile .ll files into .bc, just compile them with emscripten directly
# Not recommended, this is mainly for the test runner, or if you have some other
@@ -118,12 +122,43 @@ if len(sys.argv) == 1:
print 'emcc: no input files'
exit(1)
+# read response files very early on
+response_file = True
+while response_file:
+ response_file = None
+ for index in range(1, len(sys.argv)):
+ if sys.argv[index][0] == '@':
+ # found one, loop again next time
+ print >>sys.stderr, 'emcc: using response file: %s' % response_file
+ response_file = sys.argv[index][1:]
+ if not os.path.exists(response_file):
+ print >>sys.stderr, 'emcc: error: Response file not found: %s' % response_file
+ exit(1)
+
+ response_fd = open(response_file, 'r')
+ extra_args = shlex.split(response_fd.read())
+ response_fd.close()
+
+ # slice in extra_args in place of the response file arg
+ sys.argv[index:index+1] = extra_args
+ #if DEBUG: print >>sys.stderr, "Expanded response file: " + " | ".join(sys.argv)
+ break
+
if sys.argv[1] == '--version':
- print '''emcc (Emscripten GCC-like replacement) 2.0
-Copyright (C) 2012 the Emscripten authors.
+ revision = '(unknown revision)'
+ here = os.getcwd()
+ os.chdir(shared.path_from_root())
+ try:
+ revision = execute(['git', 'show'], stdout=PIPE, stderr=PIPE)[0].split('\n')[0]
+ except:
+ pass
+ finally:
+ os.chdir(here)
+ print '''emcc (Emscripten GCC-like replacement) %s (%s)
+Copyright (C) 2013 the Emscripten authors (see AUTHORS.txt)
This is free and open source software under the MIT license.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- '''
+ ''' % (shared.EMSCRIPTEN_VERSION, revision)
exit(0)
elif sys.argv[1] == '--help':
this = os.path.basename('em++' if os.environ.get('EMMAKEN_CXX') else 'emcc')
@@ -146,16 +181,23 @@ Options that are modified or new in %s include:
tools/shared.py and also src/settings.js.)
Note: Optimizations are only done when
compiling to JavaScript, not to intermediate
- bitcode.
+ bitcode, *unless* you build with
+ EMCC_OPTIMIZE_NORMALLY=1 (not recommended
+ unless you know what you are doing!)
-O2 As -O1, plus the relooper (loop recreation),
- plus closure compiler advanced opts, plus
- LLVM -O2 optimizations
- Warning: Compiling with this takes a long time!
+ plus LLVM -O2 optimizations
-O3 As -O2, plus dangerous optimizations that may
- break the generated code! This is not
- recommended at all, see the wiki for more
- details (you can try -O2 and then add
- dangerous optimizations one by one).
+ break the generated code! This adds
+
+ -s DOUBLE_MODE=0
+ -s PRECISE_I64_MATH=0
+ --closure 1
+ --llvm-lto 1
+
+ This is not recommended at all. A better idea
+ is to try each of these separately on top of
+ -O2 to see what works. See the wiki for more
+ information.
-s OPTION=VALUE JavaScript code generation option passed
into the emscripten compiler. For the
@@ -177,6 +219,12 @@ Options that are modified or new in %s include:
the last compilation phase from bitcode to
JavaScript, or else we will remove it by
default in -O1 and above.
+ In -O0, line numbers wil be shown in the
+ generated code. In -O1 and above, the optimizer
+ removes those comments. This flag does however
+ have the effect of disabling anything that
+ causes name mangling or minification (closure
+ or the registerize pass).
--typed-arrays <mode> 0: No typed arrays
1: Parallel typed arrays
@@ -187,14 +235,23 @@ Options that are modified or new in %s include:
2: -O2 LLVM optimizations
3: -O3 LLVM optimizations (default in -O2+)
- --llvm-lto <level> 0: No LLVM LTO (default in -O0)
- 1: LLVM LTO (default in -O1+)
+ --llvm-lto <level> 0: No LLVM LTO (default in -O2 and below)
+ 1: LLVM LTO (default in -O3)
Note: If LLVM optimizations are not run
(see --llvm-opts), setting this to 1 has no
effect.
- --closure <on> 0: No closure compiler (default in -O0, -O1)
- 1: Run closure compiler (default in -O2, -O3)
+ --closure <on> 0: No closure compiler (default in -O2 and below)
+ 1: Run closure compiler. This greatly reduces
+ code size and may in some cases increase
+ runtime speed (although the opposite can also
+ occur). Note that it takes time to run, and
+ may require some changes to the code. This
+ is run by default in -O3.
+
+ Note: If closure compiler hits an out-of-memory,
+ try adjusting JAVA_HEAP_SIZE in the environment
+ (for example, to 4096m for 4GB).
--js-transform <cmd> <cmd> will be called on the generated code
before it is optimized. This lets you modify
@@ -345,6 +402,25 @@ Options that are modified or new in %s include:
for a later incremental build (where you also
enable it) to be sped up.
+ Caching works separately on 4 parts of compilation:
+ 'pre' which is types and global variables; that
+ information is then fed into 'funcs' which are
+ the functions (which we parallelize), and then
+ 'post' which adds final information based on
+ the functions (e.g., do we need long64 support
+ code). Finally, 'jsfuncs' are JavaScript-level
+ optimizations. Each of the 4 parts can be cached
+ separately, but note that they can affect each
+ other: If you recompile a single C++ file that
+ changes a global variable - e.g., adds, removes
+ or modifies a global variable, say by adding
+ a printf or by adding a compile-time timestamp,
+ then 'pre' cannot be loaded from the cache. And
+ since 'pre's output is sent to 'funcs' and 'post',
+ they will get invalidated as well, and only
+ 'jsfuncs' will be cached. So avoid modifying
+ globals to let caching work fully.
+
--clear-cache Manually clears the cache of compiled
emscripten system libraries (libc++,
libc++abi, libc). This is normally
@@ -600,7 +676,8 @@ try:
ignore_dynamic_linking = False
shell_path = shared.path_from_root('src', 'shell.html')
js_libraries = []
- keep_debug = False
+ keep_llvm_debug = False
+ keep_js_debug = False
bind = False
jcache = False
if use_cxx:
@@ -616,7 +693,8 @@ try:
for i in range(len(newargs)):
newargs[i] = newargs[i].strip() # On Windows Vista (and possibly others), excessive spaces in the command line leak into the items in this array, so trim e.g. 'foo.cpp ' -> 'foo.cpp'
if newargs[i].startswith('-O'):
- requested_level = newargs[i][2]
+ # Let -O default to -O2, which is what gcc does.
+ requested_level = newargs[i][2:] or '2'
if requested_level == 's':
print >> sys.stderr, 'emcc: warning: -Os is ignored (use -O0, -O1, -O2)'
else:
@@ -667,7 +745,8 @@ try:
newargs[i] = ''
newargs[i+1] = ''
elif newargs[i] == '-g':
- keep_debug = True
+ keep_llvm_debug = True
+ keep_js_debug = True
elif newargs[i] == '--bind':
bind = True
newargs[i] = ''
@@ -737,9 +816,10 @@ try:
newargs = newargs + [default_cxx_std]
if llvm_opts is None: llvm_opts = LLVM_OPT_LEVEL[opt_level]
- if llvm_lto is None: llvm_lto = llvm_opts > 0
- if closure is None: closure = 1 if opt_level >= 2 else 0
- if opt_level <= 0: keep_debug = True # always keep debug in -O0
+ if llvm_lto is None: llvm_lto = opt_level >= 3
+ if opt_level <= 0: keep_llvm_debug = keep_js_debug = True # always keep debug in -O0
+ if opt_level > 0: keep_llvm_debug = False # JS optimizer wipes out llvm debug info from being visible
+ if closure is None and opt_level == 3: closure = True
if DEBUG: start_time = time.time() # done after parsing arguments, which might affect debug state
@@ -879,7 +959,11 @@ try:
shared.Settings.CORRECT_OVERFLOWS = 1
if shared.Settings.CORRECT_SIGNS >= 2 or shared.Settings.CORRECT_OVERFLOWS >= 2 or shared.Settings.CORRECT_ROUNDINGS >= 2:
- keep_debug = True # must keep debug info to do line-by-line operations
+ keep_llvm_debug = True # must keep debug info to do line-by-line operations
+
+ if (keep_llvm_debug or keep_js_debug) and closure:
+ print >> sys.stderr, 'emcc: warning: disabling closure because debug info was requested'
+ closure = False
if minify_whitespace is None:
minify_whitespace = closure # if closure is run, minify whitespace
@@ -927,7 +1011,15 @@ try:
# If we were just asked to generate bitcode, stop there
if final_suffix not in JS_CONTAINING_SUFFIXES:
if llvm_opts > 0:
- print >> sys.stderr, 'emcc: warning: -Ox flags ignored, since not generating JavaScript'
+ if not os.environ.get('EMCC_OPTIMIZE_NORMALLY'):
+ print >> sys.stderr, 'emcc: warning: -Ox flags ignored, since not generating JavaScript'
+ else:
+ for input_file in input_files:
+ if input_file.endswith(SOURCE_SUFFIXES):
+ if DEBUG: print >> sys.stderr, 'emcc: optimizing %s with -O%d since EMCC_OPTIMIZE_NORMALLY defined' % (input_file, llvm_opts)
+ shared.Building.llvm_opt(in_temp(unsuffixed(uniquename(input_file)) + '.o'), llvm_opts)
+ else:
+ if DEBUG: print >> sys.stderr, 'emcc: not optimizing %s despite EMCC_OPTIMIZE_NORMALLY since not source code' % (input_file)
if not specified_target:
for input_file in input_files:
shutil.move(in_temp(unsuffixed(uniquename(input_file)) + '.o'), unsuffixed_basename(input_file) + '.' + final_suffix)
@@ -984,7 +1076,7 @@ try:
def create_libcxx():
if DEBUG: print >> sys.stderr, 'emcc: building libcxx for cache'
os = []
- for src in ['algorithm.cpp', 'condition_variable.cpp', 'future.cpp', 'iostream.cpp', 'memory.cpp', 'random.cpp', 'stdexcept.cpp', 'system_error.cpp', 'utility.cpp', 'bind.cpp', 'debug.cpp', 'hash.cpp', 'mutex.cpp', 'string.cpp', 'thread.cpp', 'valarray.cpp', 'chrono.cpp', 'exception.cpp', 'ios.cpp', 'locale.cpp', 'regex.cpp', 'strstream.cpp', 'typeinfo.cpp']:
+ for src in ['algorithm.cpp', 'condition_variable.cpp', 'future.cpp', 'iostream.cpp', 'memory.cpp', 'random.cpp', 'stdexcept.cpp', 'system_error.cpp', 'utility.cpp', 'bind.cpp', 'debug.cpp', 'hash.cpp', 'mutex.cpp', 'string.cpp', 'thread.cpp', 'valarray.cpp', 'chrono.cpp', 'exception.cpp', 'ios.cpp', 'locale.cpp', 'regex.cpp', 'strstream.cpp']:
o = in_temp(src + '.o')
execute([shared.PYTHON, shared.EMXX, shared.path_from_root('system', 'lib', 'libcxx', src), '-o', o], stdout=stdout, stderr=stderr)
os.append(o)
@@ -1003,7 +1095,7 @@ try:
def create_libcxxabi():
if DEBUG: print >> sys.stderr, 'emcc: building libcxxabi for cache'
os = []
- for src in ['private_typeinfo.cpp']:
+ for src in ['private_typeinfo.cpp', 'typeinfo.cpp']:
o = in_temp(src + '.o')
execute([shared.PYTHON, shared.EMXX, shared.path_from_root('system', 'lib', 'libcxxabi', 'src', src), '-o', o], stdout=stdout, stderr=stderr)
os.append(o)
@@ -1017,29 +1109,32 @@ try:
libcxxabi_symbols = filter(lambda symbol: symbol not in libc_symbols, libcxxabi_symbols)
libcxxabi_symbols = set(libcxxabi_symbols)
- force = False # If we have libcxx, we must force inclusion of libc, since libcxx uses new internally. Note: this is kind of hacky
-
+ # If we have libcxx, we must force inclusion of libc, since libcxx uses new internally. Note: this is kind of hacky
+ # Settings this in the environment will avoid checking dependencies and mak