summaryrefslogtreecommitdiff
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 make building big projects a little faster
+ force = os.environ.get('EMCC_FORCE_STDLIBS')
+ has = need = None
for name, create, fix, library_symbols in [('libcxx', create_libcxx, fix_libcxx, libcxx_symbols),
('libcxxabi', create_libcxxabi, fix_libcxxabi, libcxxabi_symbols),
('libc', create_libc, fix_libc, libc_symbols)]:
- need = set()
- has = set()
- for temp_file in temp_files:
- symbols = shared.Building.llvm_nm(temp_file)
- for library_symbol in library_symbols:
- if library_symbol in symbols.undefs:
- need.add(library_symbol)
- if library_symbol in symbols.defs:
- has.add(library_symbol)
- for haz in has: # remove symbols that are supplied by another of the inputs
- if haz in need:
- need.remove(haz)
- if DEBUG: print >> sys.stderr, 'emcc: considering including %s: we need %s and have %s' % (name, str(need), str(has))
+ if not force:
+ need = set()
+ has = set()
+ for temp_file in temp_files:
+ symbols = shared.Building.llvm_nm(temp_file)
+ for library_symbol in library_symbols:
+ if library_symbol in symbols.undefs:
+ need.add(library_symbol)
+ if library_symbol in symbols.defs:
+ has.add(library_symbol)
+ for haz in has: # remove symbols that are supplied by another of the inputs
+ if haz in need:
+ need.remove(haz)
+ if DEBUG: print >> sys.stderr, 'emcc: considering including %s: we need %s and have %s' % (name, str(need), str(has))
if force or len(need) > 0:
# We need to build and link the library in
if DEBUG: print >> sys.stderr, 'emcc: including %s' % name
libfile = shared.Cache.get(name, create)
- if len(has) > 0:
+ if has and len(has) > 0:
# remove the symbols we do not need
fixed = in_temp(uniquename(libfile)) + '.bc'
shutil.copyfile(libfile, fixed)
@@ -1049,7 +1144,7 @@ try:
libfile = fixed
extra_files_to_link.append(libfile)
force = True
- if fix:
+ if fix and need:
fix(need)
# First, combine the bitcode files if there are several. We must also link if we have a singleton .a
@@ -1057,7 +1152,10 @@ try:
(not LEAVE_INPUTS_RAW and not (suffix(temp_files[0]) in BITCODE_SUFFIXES or suffix(temp_files[0]) in DYNAMICLIB_SUFFIXES) and shared.Building.is_ar(temp_files[0])):
linker_inputs = temp_files + extra_files_to_link
if DEBUG: print >> sys.stderr, 'emcc: linking: ', linker_inputs
+ t0 = time.time()
shared.Building.link(linker_inputs, in_temp(target_basename + '.bc'))
+ t1 = time.time()
+ if DEBUG: print >> sys.stderr, 'emcc: linking took %.2f seconds' % (t1 - t0)
final = in_temp(target_basename + '.bc')
else:
if not LEAVE_INPUTS_RAW:
@@ -1084,11 +1182,14 @@ try:
# Optimize, if asked to
if not LEAVE_INPUTS_RAW:
- link_opts = [] if keep_debug else ['-strip-debug']
+ link_opts = [] if keep_llvm_debug else ['-strip-debug'] # remove LLVM debug info in -O1+, since the optimizer removes it anyhow
if llvm_opts > 0:
- shared.Building.llvm_opt(in_temp(target_basename + '.bc'), llvm_opts)
- if DEBUG: save_intermediate('opt', 'bc')
- # Do LTO in a separate pass to work around LLVM bug XXX (see failure e.g. in cubescript)
+ if not os.environ.get('EMCC_OPTIMIZE_NORMALLY'):
+ shared.Building.llvm_opt(in_temp(target_basename + '.bc'), llvm_opts)
+ if DEBUG: save_intermediate('opt', 'bc')
+ # Do LTO in a separate pass to work around LLVM bug XXX (see failure e.g. in cubescript)
+ else:
+ if DEBUG: print >> sys.stderr, 'emcc: not running opt because EMCC_OPTIMIZE_NORMALLY was specified, opt should have been run before'
if shared.Building.can_build_standalone():
# If we can LTO, do it before dce, since it opens up dce opportunities
if llvm_lto and shared.Building.can_use_unsafe_opts():
@@ -1175,7 +1276,7 @@ try:
def flush_js_optimizer_queue():
global final, js_optimizer_queue
if len(js_optimizer_queue) > 0 and not(len(js_optimizer_queue) == 1 and js_optimizer_queue[0] == 'last'):
- if DEBUG < 2:
+ if DEBUG != '2':
if shared.Settings.ASM_JS:
js_optimizer_queue = ['asm'] + js_optimizer_queue
if DEBUG: print >> sys.stderr, 'emcc: applying js optimization passes:', js_optimizer_queue
@@ -1194,7 +1295,7 @@ try:
if opt_level >= 1:
if DEBUG: print >> sys.stderr, 'emcc: running pre-closure post-opts'
- if DEBUG >= 2:
+ if DEBUG == '2':
# Clean up the syntax a bit
final = shared.Building.js_optimizer(final, [], jcache)
if DEBUG: save_intermediate('pretty')
@@ -1216,8 +1317,9 @@ try:
if DEBUG: print >> sys.stderr, 'emcc: running closure'
final = shared.Building.closure_compiler(final)
if DEBUG: save_intermediate('closure')
- elif shared.Settings.ASM_JS and shared.Settings.RELOOP:
- js_optimizer_queue += ['registerize'] # we can't use closure in asm, but this does much of the same
+ elif shared.Settings.RELOOP and not closure and not keep_js_debug:
+ # do this if closure is not enabled (it gives similar speedups), and we do not need to keep debug info around
+ js_optimizer_queue += ['registerize']
if opt_level >= 1:
if DEBUG: print >> sys.stderr, 'emcc: running post-closure post-opts'
diff --git a/emscripten.py b/emscripten.py
index af762a21..1fc5f190 100755
--- a/emscripten.py
+++ b/emscripten.py
@@ -21,6 +21,9 @@ WARNING: You should normally never use this! Use emcc instead.
from tools import shared
DEBUG = os.environ.get('EMCC_DEBUG')
+if DEBUG == "0":
+ DEBUG = None
+DEBUG_CACHE = DEBUG and "cache" in DEBUG
__rootpath__ = os.path.abspath(os.path.dirname(__file__))
def path_from_root(*pathelems):
@@ -43,7 +46,7 @@ def scan(ll, settings):
if len(blockaddrs) > 0:
settings['NECESSARY_BLOCKADDRS'] = blockaddrs
-NUM_CHUNKS_PER_CORE = 5
+NUM_CHUNKS_PER_CORE = 1.25
MIN_CHUNK_SIZE = 1024*1024
MAX_CHUNK_SIZE = float(os.environ.get('EMSCRIPT_MAX_CHUNK_SIZE') or 'inf') # configuring this is just for debugging purposes
@@ -131,7 +134,7 @@ def emscript(infile, settings, outfile, libraries=[]):
settings_file = temp_files.get('.txt').name
def save_settings():
global settings_text
- settings_text = json.dumps(settings)
+ settings_text = json.dumps(settings, sort_keys=True)
s = open(settings_file, 'w')
s.write(settings_text)
s.close()
@@ -145,7 +148,21 @@ def emscript(infile, settings, outfile, libraries=[]):
if jcache:
keys = [pre_input, settings_text, ','.join(libraries)]
shortkey = shared.JCache.get_shortkey(keys)
+ if DEBUG_CACHE: print >>sys.stderr, 'shortkey', shortkey
+
out = shared.JCache.get(shortkey, keys)
+
+ if DEBUG_CACHE and not out:
+ dfpath = os.path.join(shared.TEMP_DIR, "ems_" + shortkey)
+ dfp = open(dfpath, 'w')
+ dfp.write(pre_input);
+ dfp.write("\n\n========================== settings_text\n\n");
+ dfp.write(settings_text);
+ dfp.write("\n\n========================== libraries\n\n");
+ dfp.write("\n".join(libraries))
+ dfp.close()
+ print >>sys.stderr, ' cache miss, key data dumped to %s' % dfpath
+
if out and DEBUG: print >> sys.stderr, ' loading pre from jcache'
if not out:
open(pre_file, 'w').write(pre_input)
@@ -160,12 +177,12 @@ def emscript(infile, settings, outfile, libraries=[]):
# Phase 2 - func
- cores = multiprocessing.cpu_count()
+ cores = int(os.environ.get('EMCC_CORES') or multiprocessing.cpu_count())
assert cores >= 1
if cores > 1:
- intended_num_chunks = cores * NUM_CHUNKS_PER_CORE
+ intended_num_chunks = int(round(cores * NUM_CHUNKS_PER_CORE))
chunk_size = max(MIN_CHUNK_SIZE, total_ll_size / intended_num_chunks)
- chunk_size += 3*len(meta) # keep ratio of lots of function code to meta (expensive to process, and done in each parallel task)
+ chunk_size += 3*len(meta) + len(forwarded_data)/3 # keep ratio of lots of function code to meta (expensive to process, and done in each parallel task) and forwarded data (less expensive but potentially significant)
chunk_size = min(MAX_CHUNK_SIZE, chunk_size)
else:
chunk_size = MAX_CHUNK_SIZE # if 1 core, just use the max chunk size
@@ -225,6 +242,8 @@ def emscript(infile, settings, outfile, libraries=[]):
if jcache: outputs += cached_outputs # TODO: preserve order
outputs = [output.split('//FORWARDED_DATA:') for output in outputs]
+ for output in outputs:
+ assert len(output) == 2, 'Did not receive forwarded data in an output - process failed? We only got: ' + output[0]
if DEBUG: print >> sys.stderr, ' emscript: phase 2 took %s seconds' % (time.time() - t)
if DEBUG: t = time.time()
@@ -293,7 +312,7 @@ def emscript(infile, settings, outfile, libraries=[]):
post_file = temp_files.get('.post.ll').name
open(post_file, 'w').write('\n') # no input, just processing of forwarded data
out = shared.run_js(compiler, shared.COMPILER_ENGINE, [settings_file, post_file, 'post', forwarded_file] + libraries, stdout=subprocess.PIPE, cwd=path_from_root('src'))
- post, last_forwarded_data = out.split('//FORWARDED_DATA:')
+ post, last_forwarded_data = out.split('//FORWARDED_DATA:') # if this fails, perhaps the process failed prior to printing forwarded data?
last_forwarded_json = json.loads(last_forwarded_data)
if settings.get('ASM_JS'):
@@ -317,20 +336,18 @@ def emscript(infile, settings, outfile, libraries=[]):
params = ','.join(['p%d' % p for p in range(len(sig)-1)])
coercions = ';'.join(['p%d = %sp%d%s' % (p, '+' if sig[p+1] != 'i' else '', p, '' if sig[p+1] != 'i' else '|0') for p in range(len(sig)-1)]) + ';'
ret = '' if sig[0] == 'v' else ('return %s0' % ('+' if sig[0] != 'i' else ''))
- return ('function %s(%s) { %s abort(%d); %s };' % (bad, params, coercions, i, ret), raw.replace('[0,', '[' + bad + ',').replace(',0,', ',' + bad + ',').replace(',0,', ',' + bad + ',').replace(',0]', ',' + bad + ']').replace(',0]', ',' + bad + ']'))
+ return ('function %s(%s) { %s abort(%d); %s };' % (bad, params, coercions, i, ret), raw.replace('[0,', '[' + bad + ',').replace(',0,', ',' + bad + ',').replace(',0,', ',' + bad + ',').replace(',0]', ',' + bad + ']').replace(',0]', ',' + bad + ']').replace(',0\n', ',' + bad + '\n'))
infos = [make_table(sig, raw) for sig, raw in last_forwarded_json['Functions']['tables'].iteritems()]
function_tables_defs = '\n'.join([info[0] for info in infos] + [info[1] for info in infos])
asm_setup = ''
- maths = ['Math.' + func for func in ['floor', 'abs', 'sqrt', 'pow', 'cos', 'sin', 'tan', 'acos', 'asin', 'atan', 'atan2', 'exp', 'log', 'ceil']]
- if settings['USE_MATH_IMUL']:
- maths += ['Math.imul']
- asm_setup += 'if (!Math.imul) Math.imul = function(x, y) { return (x*y)|0 }; // # not a real polyfill since semantics not identical, but close and fairly fast\n'
+ maths = ['Math.' + func for func in ['floor', 'abs', 'sqrt', 'pow', 'cos', 'sin', 'tan', 'acos', 'asin', 'atan', 'atan2', 'exp', 'log', 'ceil', 'imul']]
fundamentals = ['Math', 'Int8Array', 'Int16Array', 'Int32Array', 'Uint8Array', 'Uint16Array', 'Uint32Array', 'Float32Array', 'Float64Array']
math_envs = ['Runtime.bitshift64', 'Math.min'] # TODO: move min to maths
asm_setup += '\n'.join(['var %s = %s;' % (f.replace('.', '_'), f) for f in math_envs])
basic_funcs = ['abort', 'assert', 'asmPrintInt', 'asmPrintFloat', 'copyTempDouble', 'copyTempFloat'] + [m.replace('.', '_') for m in math_envs]
if settings['SAFE_HEAP']: basic_funcs += ['SAFE_HEAP_LOAD', 'SAFE_HEAP_STORE', 'SAFE_HEAP_CLEAR']
+ if settings['CHECK_HEAP_ALIGN']: basic_funcs += ['CHECK_ALIGN_2', 'CHECK_ALIGN_4', 'CHECK_ALIGN_8']
basic_vars = ['STACKTOP', 'STACK_MAX', 'tempDoublePtr', 'ABORT']
basic_float_vars = ['NaN', 'Infinity']
if forwarded_json['Types']['preciseI64MathUsed']:
diff --git a/src/analyzer.js b/src/analyzer.js
index adc615fb..f9b0c5af 100644
--- a/src/analyzer.js
+++ b/src/analyzer.js
@@ -18,6 +18,7 @@ function recomputeLines(func) {
// Handy sets
var BRANCH_INVOKE = set('branch', 'invoke');
+var LABEL_ENDERS = set('branch', 'return');
var SIDE_EFFECT_CAUSERS = set('call', 'invoke', 'atomic');
var UNUNFOLDABLE = set('value', 'structvalue', 'type', 'phiparam');
@@ -88,7 +89,7 @@ function analyzer(data, sidePass) {
// Internal line
if (!currLabelFinished) {
item.functions.slice(-1)[0].labels.slice(-1)[0].lines.push(subItem); // If this line fails, perhaps missing a label?
- if (subItem.intertype === 'branch') {
+ if (subItem.intertype in LABEL_ENDERS) {
currLabelFinished = true;
}
} else {
@@ -684,9 +685,9 @@ function analyzer(data, sidePass) {
params: [(signed && j + whole > sourceElements.length) ? signedKeepAlive : null],
type: 'i32',
};
- if (j == 0 && isUnsignedOp(value.op) && sourceBits < 32) {
+ if (j == 0 && sourceBits < 32) {
// zext sign correction
- result.ident = makeSignOp(result.ident, 'i' + sourceBits, 'un', 1, 1);
+ result.ident = makeSignOp(result.ident, 'i' + sourceBits, isUnsignedOp(value.op) ? 'un' : 're', 1, 1);
}
if (fraction != 0) {
var other = {
diff --git a/src/compiler.js b/src/compiler.js
index 25c306cf..14816f1e 100644
--- a/src/compiler.js
+++ b/src/compiler.js
@@ -160,12 +160,6 @@ if (SAFE_HEAP >= 2) {
SAFE_HEAP_LINES = set(SAFE_HEAP_LINES); // for fast checking
}
-if (PGO) { // by default, correct everything during PGO
- CORRECT_SIGNS = CORRECT_SIGNS || 1;
- CORRECT_OVERFLOWS = CORRECT_OVERFLOWS || 1;
- CORRECT_ROUNDINGS = CORRECT_ROUNDINGS || 1;
-}
-
EXPORTED_FUNCTIONS = set(EXPORTED_FUNCTIONS);
EXPORTED_GLOBALS = set(EXPORTED_GLOBALS);
EXCEPTION_CATCHING_WHITELIST = set(EXCEPTION_CATCHING_WHITELIST);
@@ -185,13 +179,13 @@ assert(!(!NAMED_GLOBALS && BUILD_AS_SHARED_LIB)); // shared libraries must have
if (phase == 'pre') {
if (!MICRO_OPTS || !RELOOP || ASSERTIONS || CHECK_SIGNS || CHECK_OVERFLOWS || INIT_STACK || INIT_HEAP ||
- !SKIP_STACK_IN_SMALL || SAFE_HEAP || PGO || PROFILE || !DISABLE_EXCEPTION_CATCHING) {
+ !SKIP_STACK_IN_SMALL || SAFE_HEAP || !DISABLE_EXCEPTION_CATCHING) {
print('// Note: Some Emscripten settings will significantly limit the speed of the generated code.');
} else {
print('// Note: For maximum-speed code, see "Optimizing Code" on the Emscripten wiki, https://github.com/kripken/emscripten/wiki/Optimizing-Code');
}
- if (DOUBLE_MODE || CORRECT_SIGNS || CORRECT_OVERFLOWS || CORRECT_ROUNDINGS) {
+ if (DOUBLE_MODE || CORRECT_SIGNS || CORRECT_OVERFLOWS || CORRECT_ROUNDINGS || CHECK_HEAP_ALIGN) {
print('// Note: Some Emscripten settings may limit the speed of the generated code.');
}
}
diff --git a/src/corruptionCheck.js b/src/corruptionCheck.js
new file mode 100644
index 00000000..315f5cf0
--- /dev/null
+++ b/src/corruptionCheck.js
@@ -0,0 +1,98 @@
+
+// See settings.js, CORRUPTION_CHECK
+
+var CorruptionChecker = {
+ BUFFER_FACTOR: Math.round({{{ CORRUPTION_CHECK }}}),
+
+ ptrs: {},
+ checks: 0,
+ checkFrequency: 1,
+
+ init: function() {
+ this.realMalloc = _malloc;
+ _malloc = Module['_malloc'] = this.malloc;
+
+ this.realFree = _free;
+ _free = Module['_free'] = this.free;
+
+ if (typeof _realloc != 'undefined') {
+ this.realRealloc = _realloc;
+ _realloc = Module['_realloc'] = this.realloc;
+ }
+
+ __ATEXIT__.push({ func: function() {
+ Module.printErr('No corruption detected, ran ' + CorruptionChecker.checks + ' checks.');
+ } });
+ },
+ malloc: function(size) {
+ if (size <= 0) size = 1; // malloc(0) sometimes happens - just allocate a larger area, no harm
+ CorruptionChecker.checkAll();
+ size = (size+7)&(~7);
+ var allocation = CorruptionChecker.realMalloc(size*(1+2*CorruptionChecker.BUFFER_FACTOR));
+ var ptr = allocation + size*CorruptionChecker.BUFFER_FACTOR;
+ assert(!CorruptionChecker.ptrs[ptr]);
+ CorruptionChecker.ptrs[ptr] = size;
+ CorruptionChecker.fillBuffer(allocation, size*CorruptionChecker.BUFFER_FACTOR);
+ CorruptionChecker.fillBuffer(allocation + size*(1+CorruptionChecker.BUFFER_FACTOR), size*CorruptionChecker.BUFFER_FACTOR);
+ //Module.printErr('malloc ' + size + ' ==> ' + [ptr, allocation]);
+ return ptr;
+ },
+ free: function(ptr) {
+ if (!ptr) return; // ok to free(NULL), does nothing
+ CorruptionChecker.checkAll();
+ var size = CorruptionChecker.ptrs[ptr];
+ //Module.printErr('free ' + ptr + ' of size ' + size);
+ assert(size);
+ var allocation = ptr - size*CorruptionChecker.BUFFER_FACTOR;
+ //Module.printErr('free ' + ptr + ' of size ' + size + ' and allocation ' + allocation);
+ delete CorruptionChecker.ptrs[ptr];
+ CorruptionChecker.realFree(allocation);
+ },
+ realloc: function(ptr, newSize) {
+ //Module.printErr('realloc ' + ptr + ' to size ' + newSize);
+ if (newSize <= 0) newSize = 1; // like in malloc
+ if (!ptr) return CorruptionChecker.malloc(newSize); // realloc(NULL, size) forwards to malloc according to the spec
+ var size = CorruptionChecker.ptrs[ptr];
+ assert(size);
+ var allocation = ptr - size*CorruptionChecker.BUFFER_FACTOR;
+ var newPtr = CorruptionChecker.malloc(newSize);
+ //Module.printErr('realloc ' + ptr + ' to size ' + newSize + ' is now ' + newPtr);
+ var newAllocation = newPtr + newSize*CorruptionChecker.BUFFER_FACTOR;
+ HEAPU8.set(HEAPU8.subarray(ptr, ptr + Math.min(size, newSize)), newPtr);
+ CorruptionChecker.free(ptr);
+ return newPtr;
+ },
+ canary: function(x) {
+ return (x&127) + 10;
+ },
+ fillBuffer: function(buffer, size) {
+ for (var x = buffer; x < buffer + size; x++) {
+ {{{ makeSetValue('x', 0, 'CorruptionChecker.canary(x)', 'i8') }}};
+ }
+ },
+ checkBuffer: function(buffer, size) {
+ for (var x = buffer; x < buffer + size; x++) {
+ if (({{{ makeGetValue('x', 0, 'i8') }}}&255) != CorruptionChecker.canary(x)) {
+ assert(0, 'Heap corruption detected!' + [x, buffer, size, {{{ makeGetValue('x', 0, 'i8') }}}&255, CorruptionChecker.canary(x)]);
+ }
+ }
+ },
+ checkPtr: function(ptr) {
+ var size = CorruptionChecker.ptrs[ptr];
+ assert(size);
+ var allocation = ptr - size*CorruptionChecker.BUFFER_FACTOR;
+ CorruptionChecker.checkBuffer(allocation, size*CorruptionChecker.BUFFER_FACTOR);
+ CorruptionChecker.checkBuffer(allocation + size*(1+CorruptionChecker.BUFFER_FACTOR), size*CorruptionChecker.BUFFER_FACTOR);
+ },
+ checkAll: function(force) {
+ CorruptionChecker.checks++;
+ if (!force && CorruptionChecker.checks % CorruptionChecker.checkFrequency != 0) return;
+ //Module.printErr('checking for corruption ' + (CorruptionChecker.checks/CorruptionChecker.checkFrequency));
+ for (var ptr in CorruptionChecker.ptrs) {
+ CorruptionChecker.checkPtr(ptr, false);
+ }
+ },
+};
+
+CorruptionChecker.init();
+
diff --git a/src/intertyper.js b/src/intertyper.js
index c1a98354..6c88e765 100644
--- a/src/intertyper.js
+++ b/src/intertyper.js
@@ -741,10 +741,12 @@ function intertyper(data, sidePass, baseLineNums) {
processItem: function(item) {
item.intertype = 'atomic';
if (item.tokens[0].text == 'atomicrmw') {
+ if (item.tokens[1].text == 'volatile') item.tokens.splice(1, 1);
item.op = item.tokens[1].text;
item.tokens.splice(1, 1);
} else {
assert(item.tokens[0].text == 'cmpxchg')
+ if (item.tokens[1].text == 'volatile') item.tokens.splice(1, 1);
item.op = 'cmpxchg';
}
var last = getTokenIndexByText(item.tokens, ';');
diff --git a/src/jsifier.js b/src/jsifier.js
index 761a5fec..ca404258 100644
--- a/src/jsifier.js
+++ b/src/jsifier.js
@@ -375,6 +375,7 @@ function JSify(data, functionsOnly, givenFunctions) {
var ret = [item];
item.JS = 'var ' + item.ident + ';';
// Set the actual value in a postset, since it may be a global variable. We also order by dependencies there
+ Variables.globals[item.ident].targetIdent = item.value.ident;
var value = Variables.globals[item.ident].resolvedAlias = finalizeLLVMParameter(item.value);
var fix = '';
if (BUILD_AS_SHARED_LIB == 2 && !item.private_) {
@@ -478,8 +479,7 @@ function JSify(data, functionsOnly, givenFunctions) {
ident = '_' + ident;
}
var depsText = (deps ? '\n' + deps.map(addFromLibrary).filter(function(x) { return x != '' }).join('\n') : '');
- // redirected idents just need a var, but no value assigned to them - it would be unused
- var contentText = isFunction ? snippet : ('var ' + ident + (redirectedIdent ? '' : '=' + snippet) + ';');
+ var contentText = isFunction ? snippet : ('var ' + ident + '=' + snippet + ';');
if (ASM_JS) {
var sig = LibraryManager.library[ident.substr(1) + '__sig'];
if (isFunction && sig && LibraryManager.library[ident.substr(1) + '__asm']) {
@@ -506,9 +506,9 @@ function JSify(data, functionsOnly, givenFunctions) {
item.JS = '';
} else if (LibraryManager.library.hasOwnProperty(shortident)) {
item.JS = addFromLibrary(shortident);
- } else {
+ } else if (!LibraryManager.library.hasOwnProperty(shortident + '__inline')) {
item.JS = 'var ' + item.ident + '; // stub for ' + item.ident;
- if (WARN_ON_UNDEFINED_SYMBOLS) {
+ if (WARN_ON_UNDEFINED_SYMBOLS || ASM_JS) { // always warn on undefs in asm, since it breaks validation
warn('Unresolved symbol: ' + item.ident);
}
}
@@ -631,15 +631,6 @@ function JSify(data, functionsOnly, givenFunctions) {
}
}
- if (PROFILE) {
- func.JS += ' if (PROFILING) { '
- + 'var __parentProfilingNode__ = PROFILING_NODE; PROFILING_NODE = PROFILING_NODE.children["' + func.ident + '"]; '
- + 'if (!PROFILING_NODE) __parentProfilingNode__.children["' + func.ident + '"] = PROFILING_NODE = { time: 0, children: {}, calls: 0 };'
- + 'PROFILING_NODE.calls++; '
- + 'var __profilingStartTime__ = Date.now() '
- + '}\n';
- }
-
if (true) { // TODO: optimize away when not needed
if (CLOSURE_ANNOTATIONS) func.JS += '/** @type {number} */';
func.JS += ' var label = 0;\n';
@@ -923,7 +914,11 @@ function JSify(data, functionsOnly, givenFunctions) {
case VAR_NATIVIZED:
if (isNumber(item.ident)) {
// Direct write to a memory address; this may be an intentional segfault, if not, it is a bug in the source
- return 'throw "fault on write to ' + item.ident + '";';
+ if (ASM_JS) {
+ return 'abort(' + item.ident + ')';
+ } else {
+ return 'throw "fault on write to ' + item.ident + '";';
+ }
}
return item.ident + '=' + value + ';'; // We have the actual value here
break;
@@ -1145,12 +1140,6 @@ function JSify(data, functionsOnly, givenFunctions) {
});
makeFuncLineActor('return', function(item) {
var ret = RuntimeGenerator.stackExit(item.funcData.initialStack, item.funcData.otherStackAllocations) + ';\n';
- if (PROFILE) {
- ret += 'if (PROFILING) { '
- + 'PROFILING_NODE.time += Date.now() - __profilingStartTime__; '
- + 'PROFILING_NODE = __parentProfilingNode__ '
- + '}\n';
- }
if (LABEL_DEBUG && functionNameFilterTest(item.funcData.ident)) {
ret += "Module.print(INDENT + 'Exiting: " + item.funcData.ident + "');\n"
+ "INDENT = INDENT.substr(0, INDENT.length-2);\n";
@@ -1215,6 +1204,9 @@ function JSify(data, functionsOnly, givenFunctions) {
switch (item.op) {
case 'add': return '(tempValue=' + makeGetValue(param1, 0, type) + ',' + makeSetValue(param1, 0, 'tempValue+' + param2, type, null, null, null, null, ',') + ',tempValue)';
case 'sub': return '(tempValue=' + makeGetValue(param1, 0, type) + ',' + makeSetValue(param1, 0, 'tempValue-' + param2, type, null, null, null, null, ',') + ',tempValue)';
+ case 'or': return '(tempValue=' + makeGetValue(param1, 0, type) + ',' + makeSetValue(param1, 0, 'tempValue|' + param2, type, null, null, null, null, ',') + ',tempValue)';
+ case 'and': return '(tempValue=' + makeGetValue(param1, 0, type) + ',' + makeSetValue(param1, 0, 'tempValue&' + param2, type, null, null, null, null, ',') + ',tempValue)';
+ case 'xor': return '(tempValue=' + makeGetValue(param1, 0, type) + ',' + makeSetValue(param1, 0, 'tempValue^' + param2, type, null, null, null, null, ',') + ',tempValue)';
case 'xchg': return '(tempValue=' + makeGetValue(param1, 0, type) + ',' + makeSetValue(param1, 0, param2, type, null, null, null, null, ',') + ',tempValue)';
case 'cmpxchg': {
var param3 = finalizeLLVMParameter(item.params[2]);
@@ -1237,6 +1229,15 @@ function JSify(data, functionsOnly, givenFunctions) {
var impl = item.ident ? getVarImpl(item.funcData, item.ident) : VAR_EMULATED;
switch (impl) {
case VAR_NATIVIZED: {
+ if (isNumber(item.ident)) {
+ item.assignTo = null;
+ // Direct read from a memory address; this may be an intentional segfault, if not, it is a bug in the source
+ if (ASM_JS) {
+ return 'abort(' + item.ident + ')';
+ } else {
+ return 'throw "fault on read from ' + item.ident + '";';
+ }
+ }
return value; // We have the actual value here
}
case VAR_EMULATED: return makeGetValue(value, 0, item.type, 0, item.unsigned, 0, item.align);
@@ -1260,7 +1261,7 @@ function JSify(data, functionsOnly, givenFunctions) {
makeFuncLineActor('insertvalue', function(item) {
assert(item.indexes.length == 1); // TODO: see extractvalue
var ret = '(', ident;
- if (item.ident === 'undef') {
+ if (item.ident === '0') {
item.ident = 'tempValue';
ret += item.ident + ' = [' + makeEmptyStruct(item.type) + '], ';
}
@@ -1300,6 +1301,7 @@ function JSify(data, functionsOnly, givenFunctions) {
// We cannot compile assembly. See comment in intertyper.js:'Call'
assert(ident != 'asm', 'Inline assembly cannot be compiled to JavaScript!');
+ ident = Variables.resolveAliasToIdent(ident);
var shortident = ident.slice(1);
var callIdent = LibraryManager.getRootIdent(shortident);
if (callIdent) {
@@ -1417,6 +1419,9 @@ function JSify(data, functionsOnly, givenFunctions) {
if (ASM_JS) {
assert(returnType.search(/\("'\[,/) == -1); // XXX need isFunctionType(type, out)
callIdent = '(' + callIdent + ')&{{{ FTM_' + sig + ' }}}'; // the function table mask is set in emscripten.py
+ } else if (SAFE_DYNCALLS) {
+ assert(!ASM_JS, 'cannot emit safe dyncalls in asm');
+ callIdent = '(tempInt=' + callIdent + ',tempInt < 0 || tempInt >= FUNCTION_TABLE.length-1 || !FUNCTION_TABLE[tempInt] ? abort("dyncall error: ' + sig + ' " + FUNCTION_TABLE_NAMES[tempInt]) : tempInt)';
}
callIdent = Functions.getTable(sig) + '[' + callIdent + ']';
}
@@ -1527,7 +1532,7 @@ function JSify(data, functionsOnly, givenFunctions) {
print('// ASM_LIBRARY FUNCTIONS');
function fix(f) { // fix indenting to not confuse js optimizer
f = f.substr(f.indexOf('f')); // remove initial spaces before 'function'
- f = f.substr(0, f.lastIndexOf('\n')+1); // remove spaces and last }
+ f = f.substr(0, f.lastIndexOf('\n')+1); // remove spaces and last } XXX assumes function has multiple lines
return f + '}'; // add unindented } to match function
}
print(asmLibraryFunctions.map(fix).join('\n'));
@@ -1547,6 +1552,10 @@ function JSify(data, functionsOnly, givenFunctions) {
// This is the main 'post' pass. Print out the generated code that we have here, together with the
// rest of the output that we started to print out earlier (see comment on the
// "Final shape that will be created").
+ if (CORRUPTION_CHECK) {
+ assert(!ASM_JS); // cannot monkeypatch asm!
+ print(processMacros(read('corruptionCheck.js')));
+ }
if (PRECISE_I64_MATH && Types.preciseI64MathUsed) {
print(read('long.js'));
} else {
@@ -1579,9 +1588,11 @@ function JSify(data, functionsOnly, givenFunctions) {
var shellParts = read(shellFile).split('{{BODY}}');
print(shellParts[1]);
// Print out some useful metadata (for additional optimizations later, like the eliminator)
- print('// EMSCRIPTEN_GENERATED_FUNCTIONS: ' + JSON.stringify(keys(Functions.implementedFunctions).filter(function(func) {
- return IGNORED_FUNCTIONS.indexOf(func.ident) < 0;
- })) + '\n');
+ if (EMIT_GENERATED_FUNCTIONS) {
+ print('// EMSCRIPTEN_GENERATED_FUNCTIONS: ' + JSON.stringify(keys(Functions.implementedFunctions).filter(function(func) {
+ return IGNORED_FUNCTIONS.indexOf(func.ident) < 0;
+ })) + '\n');
+ }
PassManager.serialize();
diff --git a/src/library.js b/src/library.js
index ffac685b..1676a82c 100644
--- a/src/library.js
+++ b/src/library.js
@@ -2491,6 +2491,17 @@ LibraryManager.library = {
continue;
}
+ // TODO: Support strings like "%5c" etc.
+ if (format[formatIndex] === '%' && format[formatIndex+1] == 'c') {
+ var argPtr = {{{ makeGetValue('varargs', 'argIndex', 'void*') }}};
+ argIndex += Runtime.getNativeFieldSize('void*');
+ fields++;
+ next = get();
+ {{{ makeSetValue('argPtr', 0, 'next', 'i8') }}}
+ formatIndex += 2;
+ continue;
+ }
+
// remove whitespace
while (1) {
next = get();
@@ -3352,14 +3363,15 @@ LibraryManager.library = {
___setErrNo(ERRNO_CODES.ECHILD);
return -1;
},
- perror__deps: ['puts', 'putc', 'strerror', '__errno_location'],
+ perror__deps: ['puts', 'fputs', 'fputc', 'strerror', '__errno_location'],
perror: function(s) {
// void perror(const char *s);
// http://pubs.opengroup.org/onlinepubs/000095399/functions/perror.html
+ var stdout = {{{ makeGetValue(makeGlobalUse('_stdout'), '0', 'void*') }}};
if (s) {
- _puts(s);
- _putc(':'.charCodeAt(0));
- _putc(' '.charCodeAt(0));
+ _fputs(s, stdout);
+ _fputc(':'.charCodeAt(0), stdout);
+ _fputc(' '.charCodeAt(0), stdout);
}
var errnum = {{{ makeGetValue('___errno_location()', '0', 'i32') }}};
_puts(_strerror(errnum));
@@ -4302,8 +4314,9 @@ LibraryManager.library = {
ptr = ptr|0; value = value|0; num = num|0;
var stop = 0, value4 = 0, stop4 = 0, unaligned = 0;
stop = (ptr + num)|0;
- if (num|0 >= {{{ SEEK_OPTIMAL_ALIGN_MIN }}}) {
+ if ((num|0) >= {{{ SEEK_OPTIMAL_ALIGN_MIN }}}) {
// This is unaligned, but quite large, so work hard to get to aligned settings
+ value = value & 0xff;
unaligned = ptr & 3;
value4 = value | (value << 8) | (value << 16) | (value << 24);
stop4 = stop & ~3;
@@ -4514,11 +4527,16 @@ LibraryManager.library = {
return 0;
},
+ memcmp__asm: 'true',
+ memcmp__sig: 'iiii',
memcmp: function(p1, p2, num) {
- for (var i = 0; i < num; i++) {
- var v1 = {{{ makeGetValue('p1', 'i', 'i8', 0, 1) }}};
- var v2 = {{{ makeGetValue('p2', 'i', 'i8', 0, 1) }}};
- if (v1 != v2) return v1 > v2 ? 1 : -1;
+ p1 = p1|0; p2 = p2|0; num = num|0;
+ var i = 0, v1 = 0, v2 = 0;
+ while ((i|0) < (num|0)) {
+ var v1 = {{{ makeGetValueAsm('p1', 'i', 'i8', true) }}};
+ var v2 = {{{ makeGetValueAsm('p2', 'i', 'i8', true) }}};
+ if ((v1|0) != (v2|0)) return ((v1|0) > (v2|0) ? 1 : -1)|0;
+ i = (i+1)|0;
}
return 0;
},
@@ -4619,10 +4637,8 @@ LibraryManager.library = {
__strtok_state: 0,
strtok__deps: ['__strtok_state', 'strtok_r'],
+ strtok__postset: '___strtok_state = Runtime.staticAlloc(4);',
strtok: function(s, delim) {
- if (!___strtok_state) {
- ___strtok_state = _malloc(4);
- }
return _strtok_r(s, delim, ___strtok_state);
},
@@ -5082,6 +5098,7 @@ LibraryManager.library = {
},
__cxa_call_unexpected: function(exception) {
+ Module.printErr('Unexpected exception thrown, this is not properly supported - aborting');
ABORT = true;
throw exception;
},
@@ -6686,6 +6703,9 @@ LibraryManager.library = {
pthread_mutexattr_destroy: function() {},
pthread_mutex_lock: function() {},
pthread_mutex_unlock: function() {},
+ pthread_mutex_trylock: function() {
+ return 0;
+ },
pthread_cond_init: function() {},
pthread_cond_destroy: function() {},
pthread_cond_broadcast: function() {},
@@ -6728,17 +6748,27 @@ LibraryManager.library = {
pthread_key_create: function(key, destructor) {
if (!_pthread_key_create.keys) _pthread_key_create.keys = {};
- _pthread_key_create.keys[key] = null;
+ // values start at 0
+ _pthread_key_create.keys[key] = 0;
},
pthread_getspecific: function(key) {
- return _pthread_key_create.keys[key];
+ return _pthread_key_create.keys[key] || 0;
},
pthread_setspecific: function(key, value) {
_pthread_key_create.keys[key] = value;
},
+ pthread_key_delete: ['$ERRNO_CODES'],
+ pthread_key_delete: function(key) {
+ if (_pthread_key_create.keys[key]) {
+ delete _pthread_key_create.keys[key];
+ return 0;
+ }
+ return ERRNO_CODES.EINVAL;
+ },
+
pthread_cleanup_push: function(routine, arg) {
__ATEXIT__.push({ func: function() { Runtime.dynCall('vi', routine, [arg]) } })
_pthread_cleanup_push.level = __ATEXIT__.length;
@@ -7243,23 +7273,56 @@ LibraryManager.library = {
},
select: function(nfds, readfds, writefds, exceptfds, timeout) {
- // only readfds are supported, not writefds or exceptfds
+ // readfds are supported,
+ // writefds checks socket open status
+ // exceptfds not supported
// timeout is always 0 - fully async
- assert(!writefds && !exceptfds);
- var ret = 0;
- var l = {{{ makeGetValue('readfds', 0, 'i32') }}};
- var h = {{{ makeGetValue('readfds', 4, 'i32') }}};
- nfds = Math.min(64, nfds); // fd sets have 64 bits
- for (var fd = 0; fd < nfds; fd++) {
- var bit = fd % 32, int = fd < 32 ? l : h;
- if (int & (1 << bit)) {
- // index is in the set, check if it is ready for read
- var info = Sockets.fds[fd];
- if (!info) continue;
- if (info.hasData()) ret++;
+ assert(!exceptfds);
+
+ function canRead(info) {
+ // make sure hasData exists.
+ // we do create it when the socket is connected,
+ // but other implementations may create it lazily
+ return info.hasData && info.hasData();
+ }
+
+ function canWrite(info) {
+ // make sure socket exists.
+ // we do create it when the socket is connected,
+ // but other implementations may create it lazily
+ return info.socket && (info.socket.readyState == info.socket.OPEN);
+ }
+
+ function checkfds(nfds, fds, can) {
+ if (!fds) return 0;
+
+ var bitsSet = 0;
+ var dstLow = 0;
+ var dstHigh = 0;
+ var srcLow = {{{ makeGetValue('fds', 0, 'i32') }}};
+ var srcHigh = {{{ makeGetValue('fds', 4, 'i32') }}};
+ nfds = Math.min(64, nfds); // fd sets have 64 bits
+
+ for (var fd = 0; fd < nfds; fd++) {
+ var mask = 1 << (fd % 32), int = fd < 32 ? srcLow : srcHigh;
+ if (int & mask) {
+ // index is in the set, check if it is ready for read
+ var info = Sockets.fds[fd];
+ if (info && can(info)) {
+ // set bit
+ fd < 32 ? (dstLow = dstLow | mask) : (dstHigh = dstHigh | mask);
+ bitsSet++;
+ }
+ }
}
+
+ {{{ makeSetValue('fds', 0, 'dstLow', 'i32') }}};
+ {{{ makeSetValue('fds', 4, 'dstHigh', 'i32') }}};
+ return bitsSet;
}
- return ret;
+
+ return checkfds(nfds, readfds, canRead)
+ + checkfds(nfds, writefds, canWrite);
},
// pty.h
@@ -7305,36 +7368,6 @@ LibraryManager.library = {
emscripten_random: function() {
return Math.random();
},
-
- $Profiling: {
- max_: 0,
- times: null,
- invalid: 0,
- dump: function() {
- if (Profiling.invalid) {
- Module.printErr('Invalid # of calls to Profiling begin and end!');
- return;
- }
- Module.printErr('Profiling data:')
- for (var i = 0; i < Profiling.max_; i++) {
- Module.printErr('Block ' + i + ': ' + Profiling.times[i]);
- }
- }
- },
- EMSCRIPTEN_PROFILE_INIT__deps: ['$Profiling'],
- EMSCRIPTEN_PROFILE_INIT: function(max_) {
- Profiling.max_ = max_;
- Profiling.times = new Array(max_);
- for (var i = 0; i < max_; i++) Profiling.times[i] = 0;
- },
- EMSCRIPTEN_PROFILE_BEGIN__inline: function(id) {
- return 'Profiling.times[' + id + '] -= Date.now();'
- + 'Profiling.invalid++;'
- },
- EMSCRIPTEN_PROFILE_END__inline: function(id) {
- return 'Profiling.times[' + id + '] += Date.now();'
- + 'Profiling.invalid--;'
- }
};
function autoAddDeps(object, name) {
diff --git a/src/library_browser.js b/src/library_browser.js
index 6b1e956d..5b19a360 100644
--- a/src/library_browser.js
+++ b/src/library_browser.js
@@ -68,6 +68,7 @@ mergeInto(LibraryManager.library, {
function getMimetype(name) {
return {
'jpg': 'image/jpeg',
+ 'jpeg': 'image/jpeg',
'png': 'image/png',
'bmp': 'image/bmp',
'ogg': 'audio/ogg',
@@ -81,7 +82,7 @@ mergeInto(LibraryManager.library, {
var imagePlugin = {};
imagePlugin['canHandle'] = function(name) {
- return !Module.noImageDecoding && name.substr(-4) in { '.jpg': 1, '.png': 1, '.bmp': 1 };
+ return !Module.noImageDecoding && /\.(jpg|jpeg|png|bmp)$/.exec(name);
};
imagePlugin['handle'] = function(byteArray, name, onload, onerror) {
var b = null;
@@ -200,8 +201,18 @@ mergeInto(LibraryManager.library, {
return null;
}
#endif
+ var ctx;
try {
- var ctx = canvas.getContext(useWebGL ? 'experimental-webgl' : '2d');
+ if (useWebGL) {
+ ctx = canvas.getContext('experimental-webgl', {
+ alpha: false,
+#if GL_TESTING
+ preserveDrawingBuffer: true
+#endif
+ });
+ } else {
+ ctx = canvas.getContext('2d');
+ }
if (!ctx) throw ':(';
} catch (e) {
Module.print('Could not create canvas - ' + e);
@@ -262,7 +273,7 @@ mergeInto(LibraryManager.library, {
}
return ctx;
},
-
+ destroyContext: function(canvas, useWebGL, setInModule) {},
requestFullScreen: function() {
var canvas = Module['canvas'];
function fullScreenChange() {
diff --git a/src/library_egl.js b/src/library_egl.js
index a9eb37dd..271ea29e 100644
--- a/src/library_egl.js
+++ b/src/library_egl.js
@@ -83,6 +83,17 @@ var LibraryEGL = {
return 1;
},
+// EGLAPI EGLBoolean EGLAPIENTRY eglTerminate(EGLDisplay dpy);
+ eglTerminate: function(display) {
+ if (display != 62000 /* Magic ID for Emscripten 'default display' */) {
+ EGL.setErrorCode(0x3008 /* EGL_BAD_DISPLAY */);
+ return 0;
+ }
+ // TODO: Tear down EGL here. Currently a no-op since we don't need to actually do anything here for the browser.
+ EGL.setErrorCode(0x3000 /* EGL_SUCCESS */);
+ return 1;
+ },
+
// EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigs(EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config);
eglGetConfigs: function(display, configs, config_size, numConfigs) {
return EGL.chooseConfig(display, 0, configs, config_size, numConfigs);
@@ -225,6 +236,20 @@ var LibraryEGL = {
return 62006; /* Magic ID for Emscripten 'default surface' */
},
+ // EGLAPI EGLBoolean EGLAPIENTRY eglDestroySurface(EGLDisplay display, EGLSurface surface);
+ eglDestroySurface: function(display, surface) {
+ if (display != 62000 /* Magic ID for Emscripten 'default display' */) {
+ EGL.setErrorCode(0x3008 /* EGL_BAD_DISPLAY */);
+ return 0;
+ }
+ if (surface != 62006 /* Magic ID for the only EGLSurface supported by Emscripten */) {
+ EGL.setErrorCode(0x300D /* EGL_BAD_SURFACE */);
+ return 1;
+ }
+ EGL.setErrorCode(0x3000 /* EGL_SUCCESS */);
+ return 1; /* Magic ID for Emscripten 'default surface' */
+ },
+
eglCreateContext__deps: ['glutCreateWindow', '$GL'],
// EGLAPI EGLContext EGLAPIENTRY eglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list);
@@ -234,7 +259,21 @@ var LibraryEGL = {
return 0;
}
- _glutCreateWindow();
+ EGL.windowID = _glutCreateWindow();
+ EGL.setErrorCode(0x3000 /* EGL_SUCCESS */);
+ return 62004; // Magic ID for Emscripten EGLContext
+ },
+
+ eglDestroyContext__deps: ['glutDestroyWindow', '$GL'],
+
+ // EGLAPI EGLBoolean EGLAPIENTRY eglDestroyContext(EGLDisplay dpy, EGLContext context);
+ eglDestroyContext: function(display, context) {
+ if (display != 62000 /* Magic ID for Emscripten 'default display' */) {
+ EGL.setErrorCode(0x3008 /* EGL_BAD_DISPLAY */);
+ return 0;
+ }
+
+ _glutDestroyWindow(EGL.windowID);
EGL.setErrorCode(0x3000 /* EGL_SUCCESS */);
return 62004; // Magic ID for Emscripten EGLContext
},
diff --git a/src/library_gc.js b/src/library_gc.js
index 083019ca..f6db74d8 100644
--- a/src/library_gc.js
+++ b/src/library_gc.js
@@ -4,7 +4,7 @@ if (GC_SUPPORT) {
EXPORTED_FUNCTIONS['_realloc'] = 1;
var LibraryGC = {
- $GC__deps: ['sbrk', 'realloc'],
+ $GC__deps: ['sbrk', 'realloc', 'calloc'],
$GC: {
ALLOCATIONS_TO_GC: 1*1024*1024,
diff --git a/src/library_gl.js b/src/library_gl.js
index 8b29e4e2..4977d2e9 100644
--- a/src/library_gl.js
+++ b/src/library_gl.js
@@ -19,6 +19,28 @@ var LibraryGL = {
uniforms: [],
shaders: [],
+#if FULL_ES2
+ clientBuffers: [],
+ enabledClientBuffers: [],
+#endif
+ currArrayBuffer: 0,
+ currElementArrayBuffer: 0,
+
+ byteSizeByTypeRoot: 0x1400, // GL_BYTE
+ byteSizeByType: [
+ 1, // GL_BYTE
+ 1, // GL_UNSIGNED_BYTE
+ 2, // GL_SHORT
+ 2, // GL_UNSIGNED_SHORT
+ 4, // GL_INT
+ 4, // GL_UNSIGNED_INT
+ 4, // GL_FLOAT
+ 2, // GL_2_BYTES
+ 3, // GL_3_BYTES
+ 4, // GL_4_BYTES
+ 8 // GL_DOUBLE
+ ],
+
uniformTable: {}, // name => uniform ID. the uID must be identical until relinking, cannot create a new uID each call to glGetUniformLocation
packAlignment: 4, // default alignment is 4 bytes
@@ -176,12 +198,48 @@ var LibraryGL = {
}
},
+#if FULL_ES2
+ calcBufLength: function(size, type, stride, count) {
+ if (stride > 0) {
+ return count * stride; // XXXvlad this is not exactly correct I don't think
+ }
+ var typeSize = GL.byteSizeByType[type - GL.byteSizeByTypeRoot];
+ return size * typeSize * count;
+ },
+
+ preDrawHandleClientVertexAttribBindings: function(count) {
+ GL.resetBufferBinding = false;
+ for (var i = 0; i < GL.maxVertexAttribs; ++i) {
+ if (!GL.enabledClientBuffers[i] || !GL.clientBuffers[i]) continue;
+
+ GL.resetBufferBinding = true;
+
+ var cb = GL.clientBuffers[i];
+
+ var buf = Module.ctx.createBuffer();
+ Module.ctx.bindBuffer(Module.ctx.ARRAY_BUFFER, buf);
+ Module.ctx.bufferData(Module.ctx.ARRAY_BUFFER,
+ HEAPU8.subarray(cb.ptr, cb.ptr + GL.calcBufLength(cb.size, cb.type, cb.stride, count)),
+ Module.ctx.DYNAMIC_DRAW);
+ Module.ctx.vertexAttribPointer(i, cb.size, cb.type, cb.normalized, cb.stride, 0);
+ }
+ },
+
+ postDrawHandleClientVertexAttribBindings: function() {
+ if (GL.resetBufferBinding) {
+ Module.ctx.bindBuffer(Module.ctx.ARRAY_BUFFER, GL.buffers[GL.currArrayBuffer]);
+ }
+ },
+#endif
+
initExtensions: function() {
if (GL.initExtensions.done) return;
GL.initExtensions.done = true;
if (!Module.useWebGL) return; // an app might link both gl and 2d backends
+ GL.maxVertexAttribs = Module.ctx.getParameter(Module.ctx.MAX_VERTEX_ATTRIBS);
+
GL.compressionExt = Module.ctx.getExtension('WEBGL_compressed_texture_s3tc') ||
Module.ctx.getExtension('MOZ_WEBGL_compressed_texture_s3tc') ||
Module.ctx.getExtension('WEBKIT_WEBGL_compressed_texture_s3tc');
@@ -408,7 +466,19 @@ var LibraryGL = {
},
glReadPixels: function(x, y, width, height, format, type, pixels) {
- Module.ctx.readPixels(x, y, width, height, format, type, HEAPU8.subarray(pixels));
+ assert(type == 0x1401 /* GL_UNSIGNED_BYTE */);
+ var sizePerPixel;
+ switch (format) {
+ case 0x1907 /* GL_RGB */:
+ sizePerPixel = 3;
+ break;
+ case 0x1908 /* GL_RGBA */:
+ sizePerPixel = 4;
+ break;
+ default: throw 'unsupported glReadPixels format';
+ }
+ var totalSize = width*height*sizePerPixel;
+ Module.ctx.readPixels(x, y, width, height, format, type, HEAPU8.subarray(pixels, pixels + totalSize));
},
glBindTexture: function(target, texture) {
@@ -444,6 +514,9 @@ var LibraryGL = {
var id = {{{ makeGetValue('buffers', 'i*4', 'i32') }}};
Module.ctx.deleteBuffer(GL.buffers[id]);
GL.buffers[id] = null;
+
+ if (id == GL.currArrayBuffer) GL.currArrayBuffer = 0;
+ if (id == GL.currElementArrayBuffer) GL.currElementArrayBuffer = 0;
}
},
@@ -462,11 +535,9 @@ var LibraryGL = {
},
glIsBuffer: function(buffer) {
- var fb = GL.buffers[buffer];
- if (typeof(fb) == 'undefined') {
- return 0;
- }
- return Module.ctx.isBuffer(fb);
+ var b = GL.buffers[buffer];
+ if (!b) return 0;
+ return Module.ctx.isBuffer(b);
},
glGenRenderbuffers__sig: 'vii',
@@ -497,11 +568,9 @@ var LibraryGL = {
},
glIsRenderbuffer: function(renderbuffer) {
- var fb = GL.renderbuffers[renderbuffer];
- if (typeof(fb) == 'undefined') {
- return 0;
- }
- return Module.ctx.isRenderbuffer(fb);
+ var rb = GL.renderbuffers[renderbuffer];
+ if (!rb) return 0;
+ return Module.ctx.isRenderbuffer(rb);
},
glGetUniformfv: function(program, location, params) {
@@ -542,6 +611,11 @@ var LibraryGL = {
},
glGetVertexAttribfv: function(index, pname, params) {
+#if FULL_ES2
+ if (GL.clientBuffers[index]) {
+ Module.printErr("glGetVertexAttribfv on client-side array: not supported, bad data returned");
+ }
+#endif
var data = Module.ctx.getVertexAttrib(index, pname);
if (typeof data == 'number') {
{{{ makeSetValue('params', '0', 'data', 'float') }}};
@@ -553,6 +627,11 @@ var LibraryGL = {
},
glGetVertexAttribiv: function(index, pname, params) {
+#if FULL_ES2
+ if (GL.clientBuffers[index]) {
+ Module.printErr("glGetVertexAttribiv on client-side array: not supported, bad data returned");
+ }
+#endif
var data = Module.ctx.getVertexAttrib(index, pname);
if (typeof data == 'number' || typeof data == 'boolean') {
{{{ makeSetValue('params', '0', 'data', 'i32') }}};
@@ -564,6 +643,11 @@ var LibraryGL = {
},
glGetVertexAttribPointerv: function(index, pname, pointer) {
+#if FULL_ES2
+ if (GL.clientBuffers[index]) {
+ Module.printErr("glGetVertexAttribPointer on client-side array: not supported, bad data returned");
+ }
+#endif
{{{ makeSetValue('pointer', '0', 'Module.ctx.getVertexAttribOffset(index, pname)', 'i32') }}};
},
@@ -719,6 +803,12 @@ var LibraryGL = {
glBindBuffer__sig: 'vii',
glBindBuffer: function(target, buffer) {
+ if (target == Module.ctx.ARRAY_BUFFER) {
+ GL.currArrayBuffer = buffer;
+ } else if (target == Module.ctx.ELEMENT_ARRAY_BUFFER) {
+ GL.currElementArrayBuffer = buffer;
+ }
+
Module.ctx.bindBuffer(target, buffer ? GL.buffers[buffer] : null);
},
@@ -846,11 +936,9 @@ var LibraryGL = {
},
glIsShader: function(shader) {
- var fb = GL.shaders[shader];
- if (typeof(fb) == 'undefined') {
- return 0;
- }
- return Module.ctx.isShader(fb);
+ var s = GL.shaders[shader];
+ if (!s) return 0;
+ return Module.ctx.isShader(s);
},
glCreateProgram__sig: 'i',
@@ -908,11 +996,9 @@ var LibraryGL = {
},
glIsProgram: function(program) {
- var fb = GL.programs[program];
- if (typeof(fb) == 'undefined') {
- return 0;
- }
- return Module.ctx.isProgram(fb);
+ var program = GL.programs[program];
+ if (!program) return 0;
+ return Module.ctx.isProgram(program);
},
glBindAttribLocation__sig: 'viii',
@@ -965,9 +1051,7 @@ var LibraryGL = {
glIsFramebuffer__sig: 'ii',
glIsFramebuffer: function(framebuffer) {
var fb = GL.framebuffers[framebuffer];
- if (typeof(fb) == 'undefined') {
- return 0;
- }
+ if (!fb) return 0;
return Module.ctx.isFramebuffer(fb);
},
@@ -983,6 +1067,11 @@ var LibraryGL = {
fogMode: 0x0800, // GL_EXP
fogEnabled: false,
+ // VAO support
+ vaos: [],
+ currentVao: null,
+ enabledVertexAttribArrays: {}, // helps with vao cleanups
+
init: function() {
GLEmulation.fogColor = new Float32Array(4);
@@ -1001,6 +1090,7 @@ var LibraryGL = {
0x809E: 1, // GL_SAMPLE_ALPHA_TO_COVERAGE
0x80A0: 1 // GL_SAMPLE_COVERAGE
};
+
_glEnable = function(cap) {
// Clean up the renderer on any change to the rendering state. The optimization of
// skipping renderer setup is aimed at the case of multiple glDraw* right after each other
@@ -1008,6 +1098,11 @@ var LibraryGL = {
if (cap == 0x0B60 /* GL_FOG */) {
GLEmulation.fogEnabled = true;
return;
+ } else if (cap == 0x0de1 /* GL_TEXTURE_2D */) {
+ // XXX not according to spec, and not in desktop GL, but works in some GLES1.x apparently, so support
+ // it by forwarding to glEnableClientState
+ _glEnableClientState(cap);
+ return;
} else if (!(cap in validCapabilities)) {
return;
}
@@ -1018,6 +1113,11 @@ var LibraryGL = {
if (cap == 0x0B60 /* GL_FOG */) {
GLEmulation.fogEnabled = false;
return;
+ } else if (cap == 0x0de1 /* GL_TEXTURE_2D */) {
+ // XXX not according to spec, and not in desktop GL, but works in some GLES1.x apparently, so support
+ // it by forwarding to glDisableClientState
+ _glDisableClientState(cap);
+ return;
} else if (!(cap in validCapabilities)) {
return;
}
@@ -1032,6 +1132,17 @@ var LibraryGL = {
return Module.ctx.isEnabled(cap);
};
+ var glGetBooleanv = _glGetBooleanv;
+ _glGetBooleanv = function(pname, p) {
+ var attrib = GLEmulation.getAttributeFromCapability(pname);
+ if (attrib !== null) {
+ var result = GL.immediate.enabledClientAttributes[attrib];
+ {{{ makeSetValue('p', '0', 'result === true ? 1 : 0', 'i8') }}};
+ return;
+ }
+ glGetBooleanv(pname, p);
+ };
+
var glGetIntegerv = _glGetIntegerv;
_glGetIntegerv = function(pname, params) {
switch (pname) {
@@ -1052,6 +1163,51 @@ var LibraryGL = {
return;
}
case 0x8871: pname = Module.ctx.MAX_COMBINED_TEXTURE_IMAGE_UNITS /* close enough */; break; // GL_MAX_TEXTURE_COORDS
+ case 0x807A: { // GL_VERTEX_ARRAY_SIZE
+ var attribute = GLImmediate.clientAttributes[GLImmediate.VERTEX];
+ {{{ makeSetValue('params', '0', 'attribute ? attribute.size : 0', 'i32') }}};
+ return;
+ }
+ case 0x807B: { // GL_VERTEX_ARRAY_TYPE
+ var attribute = GLImmediate.clientAttributes[GLImmediate.VERTEX];
+ {{{ makeSetValue('params', '0', 'attribute ? attribute.type : 0', 'i32') }}};
+ return;
+ }
+ case 0x807C: { // GL_VERTEX_ARRAY_STRIDE
+ var attribute = GLImmediate.clientAttributes[GLImmediate.VERTEX];
+ {{{ makeSetValue('params', '0', 'attribute ? attribute.stride : 0', 'i32') }}};
+ return;
+ }
+ case 0x8081: { // GL_COLOR_ARRAY_SIZE
+ var attribute = GLImmediate.clientAttributes[GLImmediate.COLOR];
+ {{{ makeSetValue('params', '0', 'attribute ? attribute.size : 0', 'i32') }}};
+ return;
+ }
+ case 0x8082: { // GL_COLOR_ARRAY_TYPE
+ var attribute = GLImmediate.clientAttributes[GLImmediate.COLOR];
+ {{{ makeSetValue('params', '0', 'attribute ? attribute.type : 0', 'i32') }}};
+ return;
+ }
+ case 0x8083: { // GL_COLOR_ARRAY_STRIDE
+ var attribute = GLImmediate.clientAttributes[GLImmediate.COLOR];
+ {{{ makeSetValue('params', '0', 'attribute ? attribute.stride : 0', 'i32') }}};
+ return;
+ }
+ case 0x8088: { // GL_TEXTURE_COORD_ARRAY_SIZE
+ var attribute = GLImmediate.clientAttributes[GLImmediate.TEXTURE0];
+ {{{ makeSetValue('params', '0', 'attribute ? attribute.size : 0', 'i32') }}};
+ return;
+ }
+ case 0x8089: { // GL_TEXTURE_COORD_ARRAY_TYPE
+ var attribute = GLImmediate.clientAttributes[GLImmediate.TEXTURE0];
+ {{{ makeSetValue('params', '0', 'attribute ? attribute.type : 0', 'i32') }}};
+ return;
+ }
+ case 0x808A: { // GL_TEXTURE_COORD_ARRAY_STRIDE
+ var attribute = GLImmediate.clientAttributes[GLImmediate.TEXTURE0];
+ {{{ makeSetValue('params', '0', 'attribute ? attribute.stride : 0', 'i32') }}};
+ return;
+ }
}
glGetIntegerv(pname, params);
};
@@ -1266,19 +1422,12 @@ var LibraryGL = {
_glBindBuffer = function(target, buffer) {
glBindBuffer(target, buffer);
if (target == Module.ctx.ARRAY_BUFFER) {
- GL.currArrayBuffer = buffer;
+ if (GLEmulation.currentVao) {
+ assert(GLEmulation.currentVao.arrayBuffer == buffer || GLEmulation.currentVao.arrayBuffer == 0 || buffer == 0, 'TODO: support for multiple array buffers in vao');
+ GLEmulation.currentVao.arrayBuffer = buffer;
+ }
} else if (target == Module.ctx.ELEMENT_ARRAY_BUFFER) {
- GL.currElementArrayBuffer = buffer;
- }
- };
-
- var glDeleteBuffers = _glDeleteBuffers;
- _glDeleteBuffers = function(n, buffers) {
- glDeleteBuffers(n, buffers);
- for (var i = 0; i < n; i++) {
- var buffer = {{{ makeGetValue('buffers', 'i*4', 'i32') }}};
- if (buffer == GL.currArrayBuffer) GL.currArrayBuffer = 0;
- if (buffer == GL.currElementArrayBuffer) GL.currElementArrayBuffer = 0;
+ if (GLEmulation.currentVao) GLEmulation.currentVao.elementArrayBuffer = buffer;
}
};
@@ -1312,6 +1461,44 @@ var LibraryGL = {
}
glHint(target, mode);
};
+
+ var glEnableVertexAttribArray = _glEnableVertexAttribArray;
+ _glEnableVertexAttribArray = function(index) {
+ glEnableVertexAttribArray(index);
+ GLEmulation.enabledVertexAttribArrays[index] = 1;
+ if (GLEmulation.currentVao) GLEmulation.currentVao.enabledVertexAttribArrays[index] = 1;
+ };
+
+ var glDisableVertexAttribArray = _glDisableVertexAttribArray;
+ _glDisableVertexAttribArray = function(index) {
+ glDisableVertexAttribArray(index);
+ delete GLEmulation.enabledVertexAttribArrays[index];
+ if (GLEmulation.currentVao) delete GLEmulation.currentVao.enabledVertexAttribArrays[index];
+ };
+
+ var glVertexAttribPointer = _glVertexAttribPointer;
+ _glVertexAttribPointer = function(index, size, type, normalized, stride, pointer) {
+ glVertexAttribPointer(index, size, type, normalized, stride, pointer);
+ if (GLEmulation.currentVao) { // TODO: avoid object creation here? likely not hot though
+ GLEmulation.currentVao.vertexAttribPointers[index] = [index, size, type, normalized, stride, pointer];
+ }
+ };
+ },
+
+ getAttributeFromCapability: function(cap) {
+ var attrib = null;
+ switch (cap) {
+ case 0x8078: // GL_TEXTURE_COORD_ARRAY
+ case 0x0de1: // GL_TEXTURE_2D - XXX not according to spec, and not in desktop GL, but works in some GLES1.x apparently, so support it
+ attrib = GL.immediate.TEXTURE0 + GL.immediate.clientActiveTexture; break;
+ case 0x8074: // GL_VERTEX_ARRAY
+ attrib = GL.immediate.VERTEX; break;
+ case 0x8075: // GL_NORMAL_ARRAY
+ attrib = GL.immediate.NORMAL; break;
+ case 0x8076: // GL_COLOR_ARRAY
+ attrib = GL.immediate.COLOR; break;
+ }
+ return attrib;
},
getProcAddress: function(name) {
@@ -1375,6 +1562,9 @@ var LibraryGL = {
case 'glIsFramebuffer': ret = {{{ Functions.getIndex('_glIsFramebuffer', true) }}}; break;
case 'glCheckFramebufferStatus': ret = {{{ Functions.getIndex('_glCheckFramebufferStatus', true) }}}; break;
case 'glRenderbufferStorage': ret = {{{ Functions.getIndex('_glRenderbufferStorage', true) }}}; break;
+ case 'glGenVertexArrays': ret = {{{ Functions.getIndex('_glGenVertexArrays', true) }}}; break;
+ case 'glDeleteVertexArrays': ret = {{{ Functions.getIndex('_glDeleteVertexArrays', true) }}}; break;
+ case 'glBindVertexArray': ret = {{{ Functions.getIndex('_glBindVertexArray', true) }}}; break;
}
if (!ret) Module.printErr('WARNING: getProcAddress failed for ' + name);
return ret;
@@ -1427,10 +1617,24 @@ var LibraryGL = {
assert(id == 0);
},
+ glGetPointerv: function(name, p) {
+ var attribute;
+ switch(name) {
+ case 0x808E: // GL_VERTEX_ARRAY_POINTER
+ attribute = GLImmediate.clientAttributes[GLImmediate.VERTEX]; break;
+ case 0x8090: // GL_COLOR_ARRAY_POINTER
+ attribute = GLImmediate.clientAttributes[GLImmediate.COLOR]; break;
+ case 0x8092: // GL_TEXTURE_COORD_ARRAY_POINTER
+ attribute = GLImmediate.clientAttributes[GLImmediate.TEXTURE0]; break;
+ default: throw 'TODO: glGetPointerv for ' + name;
+ }
+ {{{ makeSetValue('p', '0', 'attribute ? attribute.pointer : 0', 'i32') }}};
+ },
+
// GL Immediate mode
$GLImmediate__postset: 'GL.immediate.setupFuncs(); Browser.moduleContextCreatedCallbacks.push(function() { GL.immediate.init() });',
- $GLImmediate__deps: ['$Browser', '$GL'],
+ $GLImmediate__deps: ['$Browser', '$GL', '$GLEmulation'],
$GLImmediate: {
MAX_TEXTURES: 7,
@@ -1479,17 +1683,6 @@ var LibraryGL = {
clientActiveTexture: 0,
clientColor: null,
- byteSizeByTypeRoot: 0x1400, // GL_BYTE
- byteSizeByType: [
- 1, // GL_BYTE
- 1, // GL_UNSIGNED_BYTE
- 2, // GL_SHORT
- 2, // GL_UNSIGNED_SHORT
- 4, // GL_INT
- 4, // GL_UNSIGNED_INT
- 4 // GL_FLOAT
- ],
-
setClientAttribute: function(name, size, type, stride, pointer) {
var attrib = this.clientAttributes[name];
attrib.name = name;
@@ -1565,7 +1758,7 @@ var LibraryGL = {
#endif
this.enabledClientAttributes[name] = true;
this.setClientAttribute(name, size, type, 0, this.rendererComponentPointer);
- this.rendererComponentPointer += size * this.byteSizeByType[type - this.byteSizeByTypeRoot];
+ this.rendererComponentPointer += size * GL.byteSizeByType[type - GL.byteSizeByTypeRoot];
} else {
this.rendererComponents[name]++;
}
@@ -1589,7 +1782,7 @@ var LibraryGL = {
cacheItem = temp ? temp : (cacheItem[attribute.name] = GL.immediate.rendererCacheItemTemplate.slice());
temp = cacheItem[attribute.size];
cacheItem = temp ? temp : (cacheItem[attribute.size] = GL.immediate.rendererCacheItemTemplate.slice());
- var typeIndex = attribute.type - GL.immediate.byteSizeByTypeRoot; // ensure it starts at 0 to keep the cache items dense
+ var typeIndex = attribute.type - GL.byteSizeByTypeRoot; // ensure it starts at 0 to keep the cache items dense
temp = cacheItem[typeIndex];
cacheItem = temp ? temp : (cacheItem[typeIndex] = GL.immediate.rendererCacheItemTemplate.slice());
}
@@ -1784,27 +1977,35 @@ var LibraryGL = {
}
// If the array buffer is unchanged and the renderer as well, then we can avoid all the work here
- // XXX We use some heuristics here, and this may not work in all cases. Try disabling this if you
- // have odd glitches (by setting canSkip always to 0, or even cleaning up the renderer right
- // after rendering)
+ // XXX We use some heuristics here, and this may not work in all cases. Try disabling GL_UNSAFE_OPTS if you
+ // have odd glitches
+#if GL_UNSAFE_OPTS
var lastRenderer = GL.immediate.lastRenderer;
var canSkip = this == lastRenderer &&
arrayBuffer == GL.immediate.lastArrayBuffer &&
(GL.currProgram || this.program) == GL.immediate.lastProgram &&
!GL.immediate.matricesModified;
if (!canSkip && lastRenderer) lastRenderer.cleanup();
+#endif
if (!GL.currArrayBuffer) {
// Bind the array buffer and upload data after cleaning up the previous renderer
+#if GL_UNSAFE_OPTS
+ // Potentially unsafe, since lastArrayBuffer might not reflect the true array buffer in code that mixes immediate/non-immediate
if (arrayBuffer != GL.immediate.lastArrayBuffer) {
+#endif
Module.ctx.bindBuffer(Module.ctx.ARRAY_BUFFER, arrayBuffer);
+#if GL_UNSAFE_OPTS
}
+#endif
Module.ctx.bufferSubData(Module.ctx.ARRAY_BUFFER, start, GL.immediate.vertexData.subarray(start >> 2, end >> 2));
}
+#if GL_UNSAFE_OPTS
if (canSkip) return;
GL.immediate.lastRenderer = this;
GL.immediate.lastArrayBuffer = arrayBuffer;
GL.immediate.lastProgram = GL.currProgram || this.program;
GL.immediate.matricesModified = false;
+#endif
if (!GL.currProgram) {
Module.ctx.useProgram(this.program);
@@ -1880,9 +2081,11 @@ var LibraryGL = {
Module.ctx.bindBuffer(Module.ctx.ARRAY_BUFFER, null);
}
+#if GL_UNSAFE_OPTS
GL.immediate.lastRenderer = null;
GL.immediate.lastArrayBuffer = null;
GL.immediate.lastProgram = null;
+#endif
GL.immediate.matricesModified = true;
}
};
@@ -2015,7 +2218,7 @@ var LibraryGL = {
for (var i = 0; i < attributes.length; i++) {
var attribute = attributes[i];
if (!attribute) break;
- var size = attribute.size * GL.immediate.byteSizeByType[attribute.type - GL.immediate.byteSizeByTypeRoot];
+ var size = attribute.size * GL.byteSizeByType[attribute.type - GL.byteSizeByTypeRoot];
if (size % 4 != 0) size += 4 - (size % 4); // align everything
attribute.offset = bytes;
bytes += size;
@@ -2027,7 +2230,7 @@ var LibraryGL = {
for (var i = 0; i < attributes.length; i++) {
var attribute = attributes[i];
if (!attribute) break;
- var size4 = Math.floor((attribute.size * GL.immediate.byteSizeByType[attribute.type - GL.immediate.byteSizeByTypeRoot])/4);
+ var size4 = Math.floor((attribute.size * GL.byteSizeByType[attribute.type - GL.byteSizeByTypeRoot])/4);
for (var j = 0; j < count; j++) {
for (var k = 0; k < size4; k++) { // copy in chunks of 4 bytes, our alignment makes this possible
HEAP32[((start + attribute.offset + bytes*j)>>2) + k] = HEAP32[(attribute.pointer>>2) + j*size4 + k];
@@ -2045,7 +2248,7 @@ var LibraryGL = {
assert((attribute.offset - bytes)%4 == 0); // XXX assuming 4-alignment
bytes += attribute.offset - bytes;
}
- bytes += attribute.size * GL.immediate.byteSizeByType[attribute.type - GL.immediate.byteSizeByTypeRoot];
+ bytes += attribute.size * GL.byteSizeByType[attribute.type - GL.byteSizeByTypeRoot];
if (bytes % 4 != 0) bytes += 4 - (bytes % 4); // XXX assuming 4-alignment
}
assert(beginEnd || bytes <= stride); // if not begin-end, explicit stride should make sense with total byte size
@@ -2066,7 +2269,7 @@ var LibraryGL = {
flush: function(numProvidedIndexes, startIndex, ptr) {
#if ASSERTIONS
- assert(numProvidedIndexes >= 0);
+ assert(numProvidedIndexes >= 0 || !numProvidedIndexes);
#endif
startIndex = startIndex || 0;
ptr = ptr || 0;
@@ -2127,6 +2330,10 @@ var LibraryGL = {
if (emulatedElementArrayBuffer) {
Module.ctx.bindBuffer(Module.ctx.ELEMENT_ARRAY_BUFFER, GL.buffers[GL.currElementArrayBuffer] || null);
}
+
+#if GL_UNSAFE_OPTS == 0
+ renderer.cleanup();
+#endif
}
},
@@ -2176,8 +2383,10 @@ var LibraryGL = {
glVertex2fv: function(p) {
_glVertex3f({{{ makeGetValue('p', '0', 'float') }}}, {{{ makeGetValue('p', '4', 'float') }}}, 0);
},
+
+ glVertex3i: 'glVertex3f',
- glVertex2i: function() { throw 'glVertex2i: TODO' },
+ glVertex2i: 'glVertex3f',
glTexCoord2i: function(u, v) {
#if ASSERTIONS
@@ -2341,29 +2550,21 @@ var LibraryGL = {
// ClientState/gl*Pointer
glEnableClientState: function(cap, disable) {
- var attrib;
- switch(cap) {
- case 0x8078: // GL_TEXTURE_COORD_ARRAY
- case 0x0de1: // GL_TEXTURE_2D - XXX not according to spec, and not in desktop GL, but works in some GLES1.x apparently, so support it
- attrib = GL.immediate.TEXTURE0 + GL.immediate.clientActiveTexture; break;
- case 0x8074: // GL_VERTEX_ARRAY
- attrib = GL.immediate.VERTEX; break;
- case 0x8075: // GL_NORMAL_ARRAY
- attrib = GL.immediate.NORMAL; break;
- case 0x8076: // GL_COLOR_ARRAY
- attrib = GL.immediate.COLOR; break;
- default:
+ var attrib = GLEmulation.getAttributeFromCapability(cap);
+ if (attrib === null) {
#if ASSERTIONS
- Module.printErr('WARNING: unhandled clientstate: ' + cap);
+ Module.printErr('WARNING: unhandled clientstate: ' + cap);
#endif
- return;
+ return;
}
if (disable && GL.immediate.enabledClientAttributes[attrib]) {
GL.immediate.enabledClientAttributes[attrib] = false;
GL.immediate.totalEnabledClientAttributes--;
+ if (GLEmulation.currentVao) delete GLEmulation.currentVao.enabledClientStates[cap];
} else if (!disable && !GL.immediate.enabledClientAttributes[attrib]) {
GL.immediate.enabledClientAttributes[attrib] = true;
GL.immediate.totalEnabledClientAttributes++;
+ if (GLEmulation.currentVao) GLEmulation.currentVao.enabledClientStates[cap] = 1;
}
GL.immediate.modifiedClientAttributes = true;
},
@@ -2390,6 +2591,63 @@ var LibraryGL = {
GL.immediate.clientActiveTexture = texture - 0x84C0; // GL_TEXTURE0
},
+ // Vertex array object (VAO) support. TODO: when the WebGL extension is popular, use that and remove this code and GL.vaos
+ glGenVertexArrays__deps: ['$GLEMulation'],
+ glGenVertexArrays__sig: ['vii'],
+ glGenVertexArrays: function(n, vaos) {
+ for (var i = 0; i < n; i++) {
+ var id = GL.getNewId(GLEmulation.vaos);
+ GLEmulation.vaos[id] = {
+ id: id,
+ arrayBuffer: 0,
+ elementArrayBuffer: 0,
+ enabledVertexAttribArrays: {},
+ vertexAttribPointers: {},
+ enabledClientStates: {},
+ };
+ {{{ makeSetValue('vaos', 'i*4', 'id', 'i32') }}};
+ }
+ },
+ glDeleteVertexArrays__sig: ['vii'],
+ glDeleteVertexArrays: function(n, vaos) {
+ for (var i = 0; i < n; i++) {
+ var id = {{{ makeGetValue('vaos', 'i*4', 'i32') }}};
+ GLEmulation.vaos[id] = null;
+ if (GLEmulation.currentVao && GLEmulation.currentVao.id == id) GLEmulation.currentVao = null;
+ }
+ },
+ glBindVertexArray__sig: ['vi'],
+ glBindVertexArray: function(vao) {
+ // undo vao-related things, wipe the slate clean, both for vao of 0 or an actual vao
+ GLEmulation.currentVao = null; // make sure the commands we run here are not recorded
+ if (GL.immediate.lastRenderer) GL.immediate.lastRenderer.cleanup();
+ _glBindBuffer(Module.ctx.ARRAY_BUFFER, 0); // XXX if one was there before we were bound?
+ _glBindBuffer(Module.ctx.ELEMENT_ARRAY_BUFFER, 0);
+ for (var vaa in GLEmulation.enabledVertexAttribArrays) {
+ Module.ctx.disableVertexAttribArray(vaa);
+ }
+ GLEmulation.enabledVertexAttribArrays = {};
+ GL.immediate.enabledClientAttributes = [0, 0];
+ GL.immediate.totalEnabledClientAttributes = 0;
+ GL.immediate.modifiedClientAttributes = true;
+ if (vao) {
+ // replay vao
+ var info = GLEmulation.vaos[vao];
+ _glBindBuffer(Module.ctx.ARRAY_BUFFER, info.arrayBuffer); // XXX overwrite current binding?
+ _glBindBuffer(Module.ctx.ELEMENT_ARRAY_BUFFER, info.elementArrayBuffer);
+ for (var vaa in info.enabledVertexAttribArrays) {
+ _glEnableVertexAttribArray(vaa);
+ }
+ for (var vaa in info.vertexAttribPointers) {
+ _glVertexAttribPointer.apply(null, info.vertexAttribPointers[vaa]);
+ }
+ for (var attrib in info.enabledClientStates) {
+ _glEnableClientState(attrib|0);
+ }
+ GLEmulation.currentVao = info; // set currentVao last, so the commands we ran here were not recorded
+ }
+ },
+
// OpenGL Immediate Mode matrix routines.
// Note that in the future we might make these available only in certain modes.
glMatrixMode__deps: ['$GL', '$GLImmediateSetup', '$GLEmulation'], // emulation is not strictly needed, this is a workaround
@@ -2480,6 +2738,7 @@ var LibraryGL = {
GL.immediate.matrix.lib.mat4.multiply(GL.immediate.matrix[GL.immediate.currentMatrix],
GL.immediate.matrix.lib.mat4.frustum(left, right, bottom, top_, nearVal, farVal));
},
+ glFrustumf: 'glFrustum',
glOrtho: function(left, right, bottom, top_, nearVal, farVal) {
GL.immediate.matricesModified = true;
@@ -2581,36 +2840,121 @@ var LibraryGL = {
glTexGeni: function() { throw 'glTexGeni: TODO' },
glTexGenfv: function() { throw 'glTexGenfv: TODO' },
- glTexEnvi: function() { throw 'glTexEnvi: TODO' },
- glTexEnvfv: function() { throw 'glTexEnvfv: TODO' },
+ glTexEnvi: function() { Runtime.warnOnce('glTexEnvi: TODO') },
+ glTexEnvfv: function() { Runtime.warnOnce('glTexEnvfv: TODO') },
glTexImage1D: function() { throw 'glTexImage1D: TODO' },
glTexCoord3f: function() { throw 'glTexCoord3f: TODO' },
glGetTexLevelParameteriv: function() { throw 'glGetTexLevelParameteriv: TODO' },
- // signatures of simple pass-through functions, see later
- glActiveTexture__sig: 'vi',
+ glShadeModel: function() { Runtime.warnOnce('TODO: glShadeModel') },
+
+ glVertexAttribPointer__sig: 'viiiiii',
+ glVertexAttribPointer: function(index, size, type, normalized, stride, ptr) {
+#if FULL_ES2
+ if (!GL.currArrayBuffer) {
+ GL.clientBuffers[index] = { size: size, type: type, normalized: normalized, stride: stride, ptr: ptr };
+ return;
+ }
+
+ GL.clientBuffers[index] = null;
+#endif
+ Module.ctx.vertexAttribPointer(index, size, type, normalized, stride, ptr);
+ },
+
glEnableVertexAttribArray__sig: 'vi',
+ glEnableVertexAttribArray: function(index) {
+#if FULL_ES2
+ GL.enabledClientBuffers[index] = true;
+#endif
+ Module.ctx.enableVertexAttribArray(index);
+ },
+
glDisableVertexAttribArray__sig: 'vi',
- glVertexAttribPointer__sig: 'viiiiii',
+ glDisableVertexAttribArray: function(index) {
+#if FULL_ES2
+ GL.enabledClientBuffers[index] = false;
+#endif
+ Module.ctx.disableVertexAttribArray(index);
+ },
+
+ glDrawArrays: function(mode, first, count) {
+#if FULL_ES2
+ // bind any client-side buffers
+ GL.preDrawHandleClientVertexAttribBindings(count);
+#endif
+
+ Module.ctx.drawArrays(mode, first, count);
+
+#if FULL_ES2
+ GL.postDrawHandleClientVertexAttribBindings();
+#endif
+ },
+
+ glDrawElements: function(mode, count, type, indices) {
+#if FULL_ES2
+ var buf;
+ if (!GL.currElementArrayBuffer) {
+ buf = Module.ctx.createBuffer();
+ Module.ctx.bindBuffer(Module.ctx.ELEMENT_ARRAY_BUFFER, buf);
+ Module.ctx.bufferData(Module.ctx.ELEMENT_ARRAY_BUFFER,
+ HEAPU8.subarray(indices, indices + GL.calcBufLength(1, type, 0, count)),
+ Module.ctx.DYNAMIC_DRAW);
+ // the index is now 0
+ indices = 0;
+ }
+
+ // bind any client-side buffers
+ GL.preDrawHandleClientVertexAttribBindings(count);
+#endif
+
+ Module.ctx.drawElements(mode, count, type, indices);
+
+#if FULL_ES2
+ GL.postDrawHandleClientVertexAttribBindings(count);
+
+ if (!GL.currElementArrayBuffer) {
+ Module.ctx.bindBuffer(Module.ctx.ELEMENT_ARRAY_BUFFER, null);
+ Module.ctx.deleteBuffer(buf);
+ }
+#endif
+ },
+
+ // signatures of simple pass-through functions, see later
+ glActiveTexture__sig: 'vi',
glCheckFramebufferStatus__sig: 'ii',
glRenderbufferStorage__sig: 'viiii',
+
+ // Open GLES1.1 compatibility
+ glGenFramebuffersOES : 'glGenFramebuffers',
+ glGenRenderbuffersOES : 'glGenRenderbuffers',
+ glBindFramebufferOES : 'glBindFramebuffer',
+ glBindRenderbufferOES : 'glBindRenderbuffer',
+ glGetRenderbufferParameterivOES : 'glGetRenderbufferParameteriv',
+ glFramebufferRenderbufferOES : 'glFramebufferRenderbuffer',
+ glRenderbufferStorageOES : 'glRenderbufferStorage',
+ glCheckFramebufferStatusOES : 'glCheckFramebufferStatus',
+ glDeleteFramebuffersOES : 'glDeleteFramebuffers',
+ glDeleteRenderbuffersOES : 'glDeleteRenderbuffers',
+ glGenVertexArraysOES: 'glGenVertexArrays',
+ glDeleteVertexArraysOES: 'glDeleteVertexArrays',
+ glBindVertexArrayOES: 'glBindVertexArray',
+ glFramebufferTexture2DOES: 'glFramebufferTexture2D'
};
// Simple pass-through functions. Starred ones have return values. [X] ones have X in the C name but not in the JS name
-[[0, 'shadeModel getError* finish flush'],
- [1, 'clearDepth clearDepth[f] depthFunc enable disable frontFace cullFace clear enableVertexAttribArray disableVertexAttribArray lineWidth clearStencil depthMask stencilMask checkFramebufferStatus* generateMipmap activeTexture blendEquation sampleCoverage isEnabled*'],
+[[0, 'getError* finish flush'],
+ [1, 'clearDepth clearDepth[f] depthFunc enable disable frontFace cullFace clear lineWidth clearStencil depthMask stencilMask checkFramebufferStatus* generateMipmap activeTexture blendEquation sampleCoverage isEnabled*'],
[2, 'blendFunc blendEquationSeparate depthRange depthRange[f] stencilMaskSeparate hint polygonOffset'],
- [3, 'texParameteri texParameterf drawArrays vertexAttrib2f stencilFunc stencilOp'],
- [4, 'viewport clearColor scissor vertexAttrib3f colorMask drawElements renderbufferStorage blendFuncSeparate blendColor stencilFuncSeparate stencilOpSeparate'],
+ [3, 'texParameteri texParameterf vertexAttrib2f stencilFunc stencilOp'],
+ [4, 'viewport clearColor scissor vertexAttrib3f colorMask renderbufferStorage blendFuncSeparate blendColor stencilFuncSeparate stencilOpSeparate'],
[5, 'vertexAttrib4f'],
- [6, 'vertexAttribPointer'],
[8, 'copyTexImage2D copyTexSubImage2D']].forEach(function(data) {
var num = data[0];
var names = data[1];
var args = range(num).map(function(i) { return 'x' + i }).join(', ');
- var plainStub = '(function(' + args + ') { ' + (num > 0 ? 'Module.ctx.NAME(' + args + ')' : '') + ' })';
- var returnStub = '(function(' + args + ') { ' + (num > 0 ? 'return Module.ctx.NAME(' + args + ')' : '') + ' })';
+ var plainStub = '(function(' + args + ') { Module.ctx.NAME(' + args + ') })';
+ var returnStub = '(function(' + args + ') { return Module.ctx.NAME(' + args + ') })';
names.split(' ').forEach(function(name) {
var stub = plainStub;
if (name[name.length-1] == '*') {
@@ -2643,5 +2987,10 @@ LibraryGL.$GLEmulation__deps.push(function() {
for (var func in Functions.getIndex.tentative) Functions.getIndex(func);
});
+if (FORCE_GL_EMULATION) {
+ LibraryGL.glDrawElements__deps = LibraryGL.glDrawElements__deps.concat('$GLEmulation');
+ LibraryGL.glDrawArrays__deps = LibraryGL.glDrawArrays__deps.concat('$GLEmulation');
+}
+
mergeInto(LibraryManager.library, LibraryGL);
diff --git a/src/library_glut.js b/src/library_glut.js
index 2e662698..bb4dfefa 100644
--- a/src/library_glut.js
+++ b/src/library_glut.js
@@ -381,6 +381,12 @@ var LibraryGLUT = {
return 1;
},
+ glutDestroyWindow__deps: ['$Browser'],
+ glutDestroyWindow: function(name) {
+ Module.ctx = Browser.destroyContext(Module['canvas'], true, true);
+ return 1;
+ },
+
glutReshapeWindow__deps: ['$GLUT', 'glutPostRedisplay'],
glutReshapeWindow: function(width, height) {
GLUT.cancelFullScreen();
diff --git a/src/library_sdl.js b/src/library_sdl.js
index 4ad7a9a9..96ae6fa2 100644
--- a/src/library_sdl.js
+++ b/src/library_sdl.js
@@ -44,6 +44,8 @@ var LibrarySDL = {
ctrlKey: false,
altKey: false,
+ textInput: false,
+
startTime: null,
mouseX: 0,
mouseY: 0,
@@ -173,6 +175,11 @@ var LibrarySDL = {
['i16', 'mod'],
['i32', 'unicode']
]),
+ TextInputEvent: Runtime.generateStructInfo([
+ ['i32', 'type'],
+ ['i32', 'windowID'],
+ ['b256', 'text'],
+ ]),
MouseMotionEvent: Runtime.generateStructInfo([
['i32', 'type'],
['i32', 'windowID'],
@@ -373,7 +380,7 @@ var LibrarySDL = {
}
}
// fall through
- case 'keydown': case 'keyup': case 'mousedown': case 'mouseup': case 'DOMMouseScroll': case 'mousewheel':
+ case 'keydown': case 'keyup': case 'keypress': case 'mousedown': case 'mouseup': case 'DOMMouseScroll': case 'mousewheel':
if (event.type == 'DOMMouseScroll' || event.type == 'mousewheel') {
var button = (event.type == 'DOMMouseScroll' ? event.detail : -event.wheelDelta) > 0 ? 4 : 3;
var event2 = {
@@ -397,6 +404,10 @@ var LibrarySDL = {
SDL.DOMButtons[event.button] = 0;
}
+ if (event.type == 'keypress' && !SDL.textInput) {
+ break;
+ }
+
SDL.events.push(event);
if (SDL.events.length >= 10000) {
Module.printErr('SDL event queue full, dropping earliest event');
@@ -476,6 +487,15 @@ var LibrarySDL = {
break;
}
+ case 'keypress': {
+ {{{ makeSetValue('ptr', 'SDL.structs.TextInputEvent.type', 'SDL.DOMEventToSDLEvent[event.type]', 'i32') }}}
+ // Not filling in windowID for now
+ var cStr = intArrayFromString(String.fromCharCode(event.charCode));
+ for (var i = 0; i < cStr.length; ++i) {
+ {{{ makeSetValue('ptr', 'SDL.structs.TextInputEvent.text + i', 'cStr[i]', 'i8') }}};
+ }
+ break;
+ }
case 'mousedown': case 'mouseup':
if (event.type == 'mousedown') {
// SDL_BUTTON(x) is defined as (1 << ((x)-1)). SDL buttons are 1-3,
@@ -618,6 +638,7 @@ var LibrarySDL = {
// Initialize this structure carefully for closure
SDL.DOMEventToSDLEvent['keydown'] = 0x300 /* SDL_KEYDOWN */;
SDL.DOMEventToSDLEvent['keyup'] = 0x301 /* SDL_KEYUP */;
+ SDL.DOMEventToSDLEvent['keypress'] = 0x303 /* SDL_TEXTINPUT */;
SDL.DOMEventToSDLEvent['mousedown'] = 0x401 /* SDL_MOUSEBUTTONDOWN */;
SDL.DOMEventToSDLEvent['mouseup'] = 0x402 /* SDL_MOUSEBUTTONUP */;
SDL.DOMEventToSDLEvent['mousemove'] = 0x400 /* SDL_MOUSEMOTION */;
@@ -1079,7 +1100,9 @@ var LibrarySDL = {
}
var surf = SDL.makeSurface(raw.width, raw.height, 0, false, 'load:' + filename);
var surfData = SDL.surfaces[surf];
+ surfData.ctx.globalCompositeOperation = "copy";
surfData.ctx.drawImage(raw, 0, 0, raw.width, raw.height, 0, 0, raw.width, raw.height);
+ surfData.ctx.globalCompositeOperation = "source-over";
// XXX SDL does not specify that loaded images must have available pixel data, in fact
// there are cases where you just want to blit them, so you just need the hardware
// accelerated version. However, code everywhere seems to assume that the pixels
@@ -1173,11 +1196,21 @@ var LibrarySDL = {
SDL_CondWait: function() {},
SDL_DestroyCond: function() {},
- SDL_StartTextInput: function() {}, // TODO
- SDL_StopTextInput: function() {}, // TODO
+ SDL_StartTextInput: function() {
+ SDL.textInput = true;
+ },
+ SDL_StopTextInput: function() {
+ SDL.textInput = false;
+ },
// SDL Mixer
+ Mix_Init: function(flags) {
+ if (!flags) return 0;
+ return 8; /* MIX_INIT_OGG */
+ },
+ Mix_Quit: function(){},
+
Mix_OpenAudio: function(frequency, format, channels, chunksize) {
SDL.allocateChannels(32);
// Just record the values for a later call to Mix_QuickLoad_RAW
@@ -1282,6 +1315,8 @@ var LibrarySDL = {
// the browser has already preloaded the audio file.
var channelInfo = SDL.channels[channel];
channelInfo.audio = audio = audio.cloneNode(true);
+ audio.numChannels = info.audio.numChannels;
+ audio.frequency = info.audio.frequency;
if (SDL.channelFinished) {
audio['onended'] = function() { // TODO: cache these
Runtime.getFuncWrapper(SDL.channelFinished, 'vi')(channel);
diff --git a/src/modules.js b/src/modules.js
index 695abbe7..afdbc21e 100644
--- a/src/modules.js
+++ b/src/modules.js
@@ -179,7 +179,16 @@ var Variables = {
globals: {},
indexedGlobals: {}, // for indexed globals, ident ==> index
// Used in calculation of indexed globals
- nextIndexedOffset: 0
+ nextIndexedOffset: 0,
+
+ resolveAliasToIdent: function(ident) {
+ while (1) {
+ var varData = Variables.globals[ident];
+ if (!(varData && varData.targetIdent)) break;
+ ident = varData.targetIdent; // might need to eval to turn (6) into 6
+ }
+ return ident;
+ },
};
var Types = {
@@ -330,12 +339,23 @@ var Functions = {
}
}
}
+ if (table.length > 20) {
+ // add some newlines in the table, for readability
+ var j = 10;
+ while (j+10 < table.length) {
+ table[j] += '\n';
+ j += 10;
+ }
+ }
var indices = table.toString().replace('"', '');
if (BUILD_AS_SHARED_LIB) {
// Shared libraries reuse the parent's function table.
tables[t] = Functions.getTable(t) + '.push.apply(' + Functions.getTable(t) + ', [' + indices + ']);\n';
} else {
tables[t] = 'var ' + Functions.getTable(t) + ' = [' + indices + '];\n';
+ if (SAFE_DYNCALLS) {
+ tables[t] += 'var FUNCTION_TABLE_NAMES = ' + JSON.stringify(table).replace(/\n/g, '').replace(/,0/g, ',0\n') + ';\n';
+ }
}
}
if (!generated && !ASM_JS) {
diff --git a/src/parseTools.js b/src/parseTools.js
index e081d0de..5d3c0179 100644
--- a/src/parseTools.js
+++ b/src/parseTools.js
@@ -78,6 +78,7 @@ function toNiceIdent(ident) {
assert(ident);
if (parseFloat(ident) == ident) return ident;
if (ident == 'null') return '0'; // see parseNumerical
+ if (ident == 'undef') return '0';
return ident.replace('%', '$').replace(/["&\\ \.@:<>,\*\[\]\(\)-]/g, '_');
}
@@ -103,6 +104,11 @@ function isNiceIdent(ident, loose) {
}
}
+function isJSVar(ident) {
+ return /^\(?[$_]?[\w$_\d ]*\)+$/.test(ident);
+
+}
+
function isStructPointerType(type) {
// This test is necessary for clang - in llvm-gcc, we
// could check for %struct. The downside is that %1 can
@@ -686,7 +692,7 @@ function makeCopyI64(value) {
function parseArbitraryInt(str, bits) {
// We parse the string into a vector of digits, base 10. This is convenient to work on.
- assert(bits % 32 == 0 || ('i' + (bits % 32)) in Runtime.INT_TYPES, 'Arbitrary-sized ints must tails that are of legal size');
+ assert(bits > 0); // NB: we don't check that the value in str can fit in this amount of bits
function str2vec(s) { // index 0 is the highest value
var ret = [];
@@ -976,27 +982,27 @@ function checkSafeHeap() {
return SAFE_HEAP === 1 || checkSpecificSafeHeap();
}
-if (ASM_JS) {
- var hexMemoryMask = '0x' + (TOTAL_MEMORY-1).toString(16);
- var decMemoryMask = (TOTAL_MEMORY-1).toString();
- var memoryMask = hexMemoryMask.length <= decMemoryMask.length ? hexMemoryMask : decMemoryMask;
-}
-
function getHeapOffset(offset, type, forceAsm) {
if (USE_TYPED_ARRAYS !== 2) {
return offset;
- } else {
- if (Runtime.getNativeFieldSize(type) > 4) {
- type = 'i32'; // XXX we emulate 64-bit values as 32
- }
- var shifts = Math.log(Runtime.getNativeTypeSize(type))/Math.LN2;
- offset = '(' + offset + ')';
- if (ASM_JS && (phase == 'funcs' || forceAsm)) offset = '(' + offset + '&' + memoryMask + ')';
- if (shifts != 0) {
- return '(' + offset + '>>' + shifts + ')';
+ }
+
+ if (Runtime.getNativeFieldSize(type) > 4) {
+ type = 'i32'; // XXX we emulate 64-bit values as 32
+ }
+
+ var sz = Runtime.getNativeTypeSize(type);
+ var shifts = Math.log(sz)/Math.LN2;
+ offset = '(' + offset + ')';
+ if (shifts != 0) {
+ if (CHECK_HEAP_ALIGN) {
+ return '(CHECK_ALIGN_' + sz + '(' + offset + ')>>' + shifts + ')';
} else {
- return offset;
+ return '(' + offset + '>>' + shifts + ')';
}
+ } else {
+ // we need to guard against overflows here, HEAP[U]8 expects a guaranteed int
+ return isJSVar(offset) ? offset : '(' + offset + '|0)';
}
}
@@ -1045,20 +1051,6 @@ function asmCoercion(value, type, signedness) {
}
}
-var TWO_TWENTY = Math.pow(2, 20);
-
-function asmMultiplyI32(a, b) {
- // special-case: there is no integer multiply in asm, because there is no true integer
- // multiply in JS. While we wait for Math.imul, do double multiply
- if ((isNumber(a) && Math.abs(a) < TWO_TWENTY) || (isNumber(b) && Math.abs(b) < TWO_TWENTY)) {
- return '(((' + a + ')*(' + b + '))&-1)'; // small enough to emit directly as a multiply
- }
- if (USE_MATH_IMUL) {
- return 'Math.imul(' + a + ',' + b + ')';
- }
- return '(~~(+((' + a + ')|0) * +((' + b + ')|0)))';
-}
-
function asmFloatToInt(x) {
return '(~~(' + x + '))';
}
@@ -1070,7 +1062,6 @@ function makeGetTempDouble(i, type, forSet) { // get an aliased part of the temp
var ptr = getFastValue('tempDoublePtr', '+', Runtime.getNativeTypeSize(type)*i);
var offset;
if (type == 'double') {
- if (ASM_JS) ptr = '(' + ptr + ')&' + memoryMask;
offset = '(' + ptr + ')>>3';
} else {
offset = getHeapOffset(ptr, type);
@@ -1153,8 +1144,8 @@ function makeGetValue(ptr, pos, type, noNeedFirst, unsigned, ignore, align, noSa
}
}
-function makeGetValueAsm(ptr, pos, type) {
- return makeGetValue(ptr, pos, type, null, null, null, null, null, true);
+function makeGetValueAsm(ptr, pos, type, unsigned) {
+ return makeGetValue(ptr, pos, type, null, unsigned, null, null, null, true);
}
function indexizeFunctions(value, type) {
@@ -1372,17 +1363,23 @@ function makeHEAPView(which, start, end) {
var PLUS_MUL = set('+', '*');
var MUL_DIV = set('*', '/');
var PLUS_MINUS = set('+', '-');
+var TWO_TWENTY = Math.pow(2, 20);
// Given two values and an operation, returns the result of that operation.
// Tries to do as much as possible at compile time.
+// Leaves overflows etc. unhandled, *except* for integer multiply, in order to be efficient with Math.imul
function getFastValue(a, op, b, type) {
a = a.toString();
b = b.toString();
+ a = a == 'true' ? '1' : (a == 'false' ? '0' : a);
+ b = b == 'true' ? '1' : (b == 'false' ? '0' : b);
if (isNumber(a) && isNumber(b)) {
if (op == 'pow') {
return Math.pow(a, b).toString();
} else {
- return eval(a + op + '(' + b + ')').toString(); // parens protect us from "5 - -12" being seen as "5--12" which is "(5--)12"
+ var value = eval(a + op + '(' + b + ')'); // parens protect us from "5 - -12" being seen as "5--12" which is "(5--)12"
+ if (op == '/' && type in Runtime.INT_TYPES) value = value|0; // avoid emitting floats
+ return value.toString();
}
}
if (op == 'pow') {
@@ -1410,8 +1407,14 @@ function getFastValue(a, op, b, type) {
return '(' + a + '<<' + shifts + ')';
}
}
- if (ASM_JS && !(type in Runtime.FLOAT_TYPES)) {
- return asmMultiplyI32(a, b); // unoptimized multiply, do it using asm.js's special multiply operation
+ if (!(type in Runtime.FLOAT_TYPES)) {
+ // if guaranteed small enough to not overflow into a double, do a normal multiply
+ var bits = getBits(type) || 32; // default is 32-bit multiply for things like getelementptr indexes
+ // Note that we can emit simple multiple in non-asm.js mode, but asm.js will not parse "16-bit" multiple, so must do imul there
+ if ((isNumber(a) && Math.abs(a) < TWO_TWENTY) || (isNumber(b) && Math.abs(b) < TWO_TWENTY) || (bits < 32 && !ASM_JS)) {
+ return '(((' + a + ')*(' + b + '))&' + ((Math.pow(2, bits)-1)|0) + ')'; // keep a non-eliminatable coercion directly on this
+ }
+ return 'Math.imul(' + a + ',' + b + ')';
}
} else {
if (a == '0') {
@@ -1556,7 +1559,7 @@ function makePointer(slab, pos, allocator, type, ptr) {
var ret = '';
var index = 0;
while (index < array.length) {
- ret = (ret ? ret + '.concat(' : '') + '[' + array.slice(index, index + chunkSize).map(JSON.stringify) + ']' + (ret ? ')' : '');
+ ret = (ret ? ret + '.concat(' : '') + '[' + array.slice(index, index + chunkSize).map(JSON.stringify) + ']' + (ret ? ')\n' : '');
index += chunkSize;
}
return ret;
@@ -1717,9 +1720,7 @@ function handleOverflow(text, bits) {
if (!bits) return text;
var correct = correctOverflows();
warnOnce(!correct || bits <= 32, 'Cannot correct overflows of this many bits: ' + bits);
- if (CHECK_OVERFLOWS) return 'CHECK_OVERFLOW(' + text + ', ' + bits + ', ' + Math.floor(correctSpecificOverflow() && !PGO) + (
- PGO ? ', "' + Debugging.getIdentifier() + '"' : ''
- ) + ')';
+ if (CHECK_OVERFLOWS) return 'CHECK_OVERFLOW(' + text + ', ' + bits + ', ' + Math.floor(correctSpecificOverflow()) + ')';
if (!correct) return text;
if (bits == 32) {
return '((' + text + ')|0)';
@@ -1827,9 +1828,7 @@ function makeSignOp(value, type, op, force, ignore) {
var bits, full;
if (type in Runtime.INT_TYPES) {
bits = parseInt(type.substr(1));
- full = op + 'Sign(' + value + ', ' + bits + ', ' + Math.floor(ignore || (correctSpecificSign() && !PGO)) + (
- PGO ? ', "' + (ignore ? '' : Debugging.getIdentifier()) + '"' : ''
- ) + ')';
+ full = op + 'Sign(' + value + ', ' + bits + ', ' + Math.floor(ignore || (correctSpecificSign())) + ')';
// Always sign/unsign constants at compile time, regardless of CHECK/CORRECT
if (isNumber(value)) {
return eval(full).toString();
@@ -1841,9 +1840,10 @@ function makeSignOp(value, type, op, force, ignore) {
if (!CHECK_SIGNS || ignore) {
if (bits === 32) {
if (op === 're') {
- return '((' + value + ')|0)';
+ return '(' + getFastValue(value, '|', '0') + ')';
} else {
- return '((' + value + ')>>>0)';
+
+ return '(' + getFastValue(value, '>>>', '0') + ')';
// Alternatively, we can consider the lengthier
// return makeInlineCalculation('VALUE >= 0 ? VALUE : ' + Math.pow(2, bits) + ' + VALUE', value, 'tempBigInt');
// which does not always turn us into a 32-bit *un*signed value
@@ -1852,7 +1852,7 @@ function makeSignOp(value, type, op, force, ignore) {
if (op === 're') {
return makeInlineCalculation('(VALUE << ' + (32-bits) + ') >> ' + (32-bits), value, 'tempInt');
} else {
- return '((' + value + ')&' + (Math.pow(2, bits)-1) + ')';
+ return '(' + getFastValue(value, '&', Math.pow(2, bits)-1) + ')';
}
} else { // bits > 32
if (op === 're') {
@@ -2142,14 +2142,7 @@ function processMathop(item) {
case 'add': return handleOverflow(getFastValue(idents[0], '+', idents[1], item.type), bits);
case 'sub': return handleOverflow(getFastValue(idents[0], '-', idents[1], item.type), bits);
case 'sdiv': case 'udiv': return makeRounding(getFastValue(idents[0], '/', idents[1], item.type), bits, op[0] === 's');
- case 'mul': {
- if (bits == 32 && PRECISE_I32_MUL) {
- Types.preciseI64MathUsed = true;
- return '(i64Math' + (ASM_JS ? '_' : '.') + 'multiply(' + asmCoercion(idents[0], 'i32') + ',0,' + asmCoercion(idents[1], 'i32') + ',0),' + makeGetValue('tempDoublePtr', 0, 'i32') + ')';
- } else {
- return '((' +getFastValue(idents[0], '*', idents[1], item.type) + ')&-1)'; // force a non-eliminatable coercion here, to prevent a double result from leaking
- }
- }
+ case 'mul': return getFastValue(idents[0], '*', idents[1], item.type); // overflow handling is already done in getFastValue for '*'
case 'urem': case 'srem': return getFastValue(idents[0], '%', idents[1], item.type);
case 'or': {
if (bits > 32) {
diff --git a/src/preamble.js b/src/preamble.js
index aab50e9a..9bc68d8f 100644
--- a/src/preamble.js
+++ b/src/preamble.js
@@ -150,51 +150,24 @@ function SAFE_HEAP_COPY_HISTORY(dest, src) {
//==========================================
#endif
-var CorrectionsMonitor = {
-#if PGO
- MAX_ALLOWED: Infinity,
-#else
- MAX_ALLOWED: 0, // XXX
+#if CHECK_HEAP_ALIGN
+//========================================
+// Debugging tools - alignment check
+//========================================
+function CHECK_ALIGN_8(addr) {
+ assert((addr & 7) == 0, "address must be 8-byte aligned, is " + addr + "!");
+ return addr;
+}
+function CHECK_ALIGN_4(addr) {
+ assert((addr & 3) == 0, "address must be 4-byte aligned, is " + addr + "!");
+ return addr;
+}
+function CHECK_ALIGN_2(addr) {
+ assert((addr & 1) == 0, "address must be 2-byte aligned!");
+ return addr;
+}
#endif
- corrections: 0,
- sigs: {},
- note: function(type, succeed, sig) {
- if (!succeed) {
- this.corrections++;
- if (this.corrections >= this.MAX_ALLOWED) abort('\n\nToo many corrections!');
- }
-#if PGO
- if (!sig)
- sig = (new Error().stack).toString().split('\n')[2].split(':').slice(-1)[0]; // Spidermonkey-specific FIXME
- sig = type + '|' + sig;
- if (!this.sigs[sig]) {
- //Module.print('Correction: ' + sig);
- this.sigs[sig] = [0, 0]; // fail, succeed
- }
- this.sigs[sig][succeed ? 1 : 0]++;
-#endif
- },
-
- print: function() {
-#if PGO
- var items = [];
- for (var sig in this.sigs) {
- items.push({
- sig: sig,
- fails: this.sigs[sig][0],
- succeeds: this.sigs[sig][1],
- total: this.sigs[sig][0] + this.sigs[sig][1]
- });
- }
- items.sort(function(x, y) { return y.total - x.total; });
- for (var i = 0; i < items.length; i++) {
- var item = items[i];
- Module.print(item.sig + ' : ' + item.total + ' hits, %' + (Math.ceil(100*item.fails/item.total)) + ' failures');
- }
-#endif
- }
-};
#if CHECK_OVERFLOWS
//========================================
@@ -207,24 +180,20 @@ function CHECK_OVERFLOW(value, bits, ignore, sig) {
// For signedness issue here, see settings.js, CHECK_SIGNED_OVERFLOWS
#if CHECK_SIGNED_OVERFLOWS
if (value === Infinity || value === -Infinity || value >= twopbits1 || value < -twopbits1) {
- CorrectionsMonitor.note('SignedOverflow', 0, sig);
- if (value === Infinity || value === -Infinity || Math.abs(value) >= twopbits) CorrectionsMonitor.note('Overflow');
+ throw 'SignedOverflow';
+ if (value === Infinity || value === -Infinity || Math.abs(value) >= twopbits) throw 'Overflow';
+ }
#else
if (value === Infinity || value === -Infinity || Math.abs(value) >= twopbits) {
- CorrectionsMonitor.note('Overflow', 0, sig);
+ throw 'Overflow';
+ }
#endif
#if CORRECT_OVERFLOWS
- // Fail on >32 bits - we warned at compile time
- if (bits <= 32) {
- value = value & (twopbits - 1);
- }
-#endif
- } else {
-#if CHECK_SIGNED_OVERFLOWS
- CorrectionsMonitor.note('SignedOverflow', 1, sig);
-#endif
- CorrectionsMonitor.note('Overflow', 1, sig);
+ // Fail on >32 bits - we warned at compile time
+ if (bits <= 32) {
+ value = value & (twopbits - 1);
}
+#endif
return value;
}
#endif
@@ -243,39 +212,6 @@ var INDENT = '';
var START_TIME = Date.now();
#endif
-#if PROFILE
-var PROFILING = 0;
-var PROFILING_ROOT = { time: 0, children: {}, calls: 0 };
-var PROFILING_NODE;
-
-function startProfiling() {
- PROFILING_NODE = PROFILING_ROOT;
- PROFILING = 1;
-}
-Module['startProfiling'] = startProfiling;
-
-function stopProfiling() {
- PROFILING = 0;
- assert(PROFILING_NODE === PROFILING_ROOT, 'Must have popped all the profiling call stack');
-}
-Module['stopProfiling'] = stopProfiling;
-
-function printProfiling() {
- function dumpData(name_, node, indent) {
- Module.print(indent + ('________' + node.time).substr(-8) + ': ' + name_ + ' (' + node.calls + ')');
- var children = [];
- for (var child in node.children) {
- children.push(node.children[child]);
- children[children.length-1].name_ = child;
- }
- children.sort(function(x, y) { return y.time - x.time });
- children.forEach(function(child) { dumpData(child.name_, child, indent + ' ') });
- }
- dumpData('root', PROFILING_ROOT, ' ');
-}
-Module['printProfiling'] = printProfiling;
-#endif
-
//========================================
// Runtime essentials
//========================================
@@ -334,11 +270,9 @@ Module["ccall"] = ccall;
// Returns the C function with a specified identifier (for C++, you need to do manual name mangling)
function getCFunc(ident) {
try {
- var func = eval('_' + ident);
+ var func = globalScope['Module']['_' + ident]; // closure exported function
+ if (!func) func = eval('_' + ident); // explicit lookup
} catch(e) {
- try {
- func = globalScope['Module']['_' + ident]; // closure exported function
- } catch(e) {}
}
assert(func, 'Cannot call unknown function ' + ident + ' (perhaps LLVM optimizations or closure removed it?)');
return func;
@@ -478,14 +412,6 @@ Module['ALLOC_STACK'] = ALLOC_STACK;
Module['ALLOC_STATIC'] = ALLOC_STATIC;
Module['ALLOC_NONE'] = ALLOC_NONE;
-// Simple unoptimized memset - necessary during startup
-var _memset = function(ptr, value, num) {
- var stop = ptr + num;
- while (ptr < stop) {
- {{{ makeSetValue('ptr++', 0, 'value', 'i8', null, true) }}};
- }
-}
-
// allocate(): This is for internal use. You can use it yourself as well, but the interface
// is a little tricky (see docs right below). The reason is that it is optimized
// for multiple syntaxes to save space in generated code. So you should
@@ -519,7 +445,18 @@ function allocate(slab, types, allocator, ptr) {
}
if (zeroinit) {
- _memset(ret, 0, size);
+ var ptr = ret, stop;
+#if USE_TYPED_ARRAYS == 2
+ assert((ret & 3) == 0);
+ stop = ret + (size & ~3);
+ for (; ptr < stop; ptr += 4) {
+ {{{ makeSetValue('ptr', '0', '0', 'i32', null, true) }}};
+ }
+#endif
+ stop = ret + size;
+ while (ptr < stop) {
+ {{{ makeSetValue('ptr++', '0', '0', 'i8', null, true) }}};
+ }
return ret;
}
@@ -530,7 +467,7 @@ function allocate(slab, types, allocator, ptr) {
}
#endif
- var i = 0, type;
+ var i = 0, type, typeSize, previousType;
while (i < size) {
var curr = slab[i];
@@ -552,7 +489,13 @@ function allocate(slab, types, allocator, ptr) {
#endif
setValue(ret+i, curr, type);
- i += Runtime.getNativeTypeSize(type);
+
+ // no need to look up size unless type changes, so cache it
+ if (previousType !== type) {
+ typeSize = Runtime.getNativeTypeSize(type);
+ previousType = type;
+ }
+ i += typeSize;
}
return ret;
@@ -626,6 +569,7 @@ function enlargeMemory() {
while (TOTAL_MEMORY <= STATICTOP) { // Simple heuristic. Override enlargeMemory() if your program has something more optimal for it
TOTAL_MEMORY = alignMemoryPage(2*TOTAL_MEMORY);
}
+ assert(TOTAL_MEMORY <= Math.pow(2, 30)); // 2^30==1GB is a practical maximum - 2^31 is already close to possible negative numbers etc.
#if USE_TYPED_ARRAYS == 1
var oldIHEAP = IHEAP;
Module['HEAP'] = Module['IHEAP'] = HEAP = IHEAP = new Int32Array(TOTAL_MEMORY);
@@ -655,47 +599,43 @@ function enlargeMemory() {
#endif
var TOTAL_STACK = Module['TOTAL_STACK'] || {{{ TOTAL_STACK }}};
-#if ASM_JS == 0
var TOTAL_MEMORY = Module['TOTAL_MEMORY'] || {{{ TOTAL_MEMORY }}};
-#else
-var TOTAL_MEMORY = {{{ TOTAL_MEMORY }}}; // in asm, we hardcode the mask, so cannot adjust memory at runtime
-#endif
var FAST_MEMORY = Module['FAST_MEMORY'] || {{{ FAST_MEMORY }}};
// Initialize the runtime's memory
#if USE_TYPED_ARRAYS
// check for full engine support (use string 'subarray' to avoid closure compiler confusion)
- assert(!!Int32Array && !!Float64Array && !!(new Int32Array(1)['subarray']) && !!(new Int32Array(1)['set']),
- 'Cannot fallback to non-typed array case: Code is too specialized');
+assert(!!Int32Array && !!Float64Array && !!(new Int32Array(1)['subarray']) && !!(new Int32Array(1)['set']),
+ 'Cannot fallback to non-typed array case: Code is too specialized');
#if USE_TYPED_ARRAYS == 1
- HEAP = IHEAP = new Int32Array(TOTAL_MEMORY);
- IHEAPU = new Uint32Array(IHEAP.buffer);
+HEAP = IHEAP = new Int32Array(TOTAL_MEMORY);
+IHEAPU = new Uint32Array(IHEAP.buffer);
#if USE_FHEAP
- FHEAP = new Float64Array(TOTAL_MEMORY);
+FHEAP = new Float64Array(TOTAL_MEMORY);
#endif
#endif
#if USE_TYPED_ARRAYS == 2
- var buffer = new ArrayBuffer(TOTAL_MEMORY);
- HEAP8 = new Int8Array(buffer);
- HEAP16 = new Int16Array(buffer);
- HEAP32 = new Int32Array(buffer);
- HEAPU8 = new Uint8Array(buffer);
- HEAPU16 = new Uint16Array(buffer);
- HEAPU32 = new Uint32Array(buffer);
- HEAPF32 = new Float32Array(buffer);
- HEAPF64 = new Float64Array(buffer);
-
- // Endianness check (note: assumes compiler arch was little-endian)
- HEAP32[0] = 255;
- assert(HEAPU8[0] === 255 && HEAPU8[3] === 0, 'Typed arrays 2 must be run on a little-endian system');
+var buffer = new ArrayBuffer(TOTAL_MEMORY);
+HEAP8 = new Int8Array(buffer);
+HEAP16 = new Int16Array(buffer);
+HEAP32 = new Int32Array(buffer);
+HEAPU8 = new Uint8Array(buffer);
+HEAPU16 = new Uint16Array(buffer);
+HEAPU32 = new Uint32Array(buffer);
+HEAPF32 = new Float32Array(buffer);
+HEAPF64 = new Float64Array(buffer);
+
+// Endianness check (note: assumes compiler arch was little-endian)
+HEAP32[0] = 255;
+assert(HEAPU8[0] === 255 && HEAPU8[3] === 0, 'Typed arrays 2 must be run on a little-endian system');
#endif
#else
- // Make sure that our HEAP is implemented as a flat array.
- HEAP = []; // Hinting at the size with |new Array(TOTAL_MEMORY)| should help in theory but makes v8 much slower
- for (var i = 0; i < FAST_MEMORY; i++) {
- HEAP[i] = 0; // XXX We do *not* use {{| makeSetValue(0, 'i', 0, 'null') |}} here, since this is done just to optimize runtime speed
- }
+// Make sure that our HEAP is implemented as a flat array.
+HEAP = []; // Hinting at the size with |new Array(TOTAL_MEMORY)| should help in theory but makes v8 much slower
+for (var i = 0; i < FAST_MEMORY; i++) {
+ HEAP[i] = 0; // XXX We do *not* use {{| makeSetValue(0, 'i', 0, 'null') |}} here, since this is done just to optimize runtime speed
+}
#endif
Module['HEAP'] = HEAP;
@@ -722,7 +662,7 @@ STACK_MAX = TOTAL_STACK; // we lose a little stack here, but TOTAL_STACK is nice
#if USE_TYPED_ARRAYS == 2
var tempDoublePtr = Runtime.alignMemory(allocate(12, 'i8', ALLOC_STACK), 8);
assert(tempDoublePtr % 8 == 0);
-function copyTempFloat(ptr) { // functions, because inlining this code is increases code size too much
+function copyTempFloat(ptr) { // functions, because inlining this code increases code size too much
HEAP8[tempDoublePtr] = HEAP8[ptr];
HEAP8[tempDoublePtr+1] = HEAP8[ptr+1];
HEAP8[tempDoublePtr+2] = HEAP8[ptr+2];
@@ -773,9 +713,6 @@ function preMain() {
}
function exitRuntime() {
callRuntimeCallbacks(__ATEXIT__);
-
- // Print summary of correction activity
- CorrectionsMonitor.print();
}
// Tools
@@ -832,6 +769,20 @@ Module['writeArrayToMemory'] = writeArrayToMemory;
{{{ unSign }}}
{{{ reSign }}}
+#if PRECISE_I32_MUL
+if (!Math.imul) Math.imul = function(a, b) {
+ var ah = a >>> 16;
+ var al = a & 0xffff;
+ var bh = b >>> 16;
+ var bl = b & 0xffff;
+ return (al*bl + ((ah*bl + al*bh) << 16))|0;
+};
+#else
+Math.imul = function(a, b) {
+ return (a*b)|0; // fast but imprecise
+};
+#endif
+
// A counter of dependencies for calling run(). If we need to
// do asynchronous work before running, increment this and
// decrement it. Incrementing must happen in a place like
diff --git a/src/runtime.js b/src/runtime.js
index 95c74647..e902d27b 100644
--- a/src/runtime.js
+++ b/src/runtime.js
@@ -357,7 +357,7 @@ var Runtime = {
},
addFunction: function(func, sig) {
- assert(sig);
+ //assert(sig); // TODO: support asm
var table = FUNCTION_TABLE; // TODO: support asm
var ret = table.length;
table.push(func);
@@ -509,26 +509,19 @@ function getRuntime() {
// example, -1 in int32 would be a very large number as unsigned.
function unSign(value, bits, ignore, sig) {
if (value >= 0) {
-#if CHECK_SIGNS
- if (!ignore) CorrectionsMonitor.note('UnSign', 1, sig);
-#endif
return value;
}
#if CHECK_SIGNS
- if (!ignore) CorrectionsMonitor.note('UnSign', 0, sig);
+ if (!ignore) throw 'UnSign';
#endif
return bits <= 32 ? 2*Math.abs(1 << (bits-1)) + value // Need some trickery, since if bits == 32, we are right at the limit of the bits JS uses in bitshifts
: Math.pow(2, bits) + value;
- // TODO: clean up previous line
}
// Converts a value we have as unsigned, into a signed value. For
// example, 200 in a uint8 would be a negative number.
function reSign(value, bits, ignore, sig) {
if (value <= 0) {
-#if CHECK_SIGNS
- if (!ignore) CorrectionsMonitor.note('ReSign', 1, sig);
-#endif
return value;
}
var half = bits <= 32 ? Math.abs(1 << (bits-1)) // abs is needed if bits == 32
@@ -540,10 +533,7 @@ function reSign(value, bits, ignore, sig) {
// but, in general there is no perfect solution here. With 64-bit ints, we get rounding and errors
// TODO: In i64 mode 1, resign the two parts separately and safely
#if CHECK_SIGNS
- if (!ignore) {
- CorrectionsMonitor.note('ReSign', 0, sig);
- noted = true;
- }
+ if (!ignore) throw 'ReSign';
#endif
value = -2*half + value; // Cannot bitshift half, as it may be at the limit of the bits JS uses in bitshifts
}
@@ -552,18 +542,9 @@ function reSign(value, bits, ignore, sig) {
// without CHECK_SIGNS, we would just do the |0 shortcut, so check that that
// would indeed give the exact same result.
if (bits === 32 && (value|0) !== value && typeof value !== 'boolean') {
- if (!ignore) {
- CorrectionsMonitor.note('ReSign', 0, sig);
- noted = true;
- }
+ if (!ignore) throw 'ReSign';
}
- if (!noted) CorrectionsMonitor.note('ReSign', 1, sig);
#endif
return value;
}
-// Just a stub. We don't care about noting compile-time corrections. But they are called.
-var CorrectionsMonitor = {
- note: function(){}
-};
-
diff --git a/src/settings.js b/src/settings.js
index 23898195..3fd31326 100644
--- a/src/settings.js
+++ b/src/settings.js
@@ -92,13 +92,9 @@ var PRECISE_I64_MATH = 1; // If enabled, i64 addition etc. is emulated - which i
// that we can't know at compile time that 64-bit math is needed. For example, if you
// print 64-bit values with printf, but never add them, we can't know at compile time
// and you need to set this to 2.
-var PRECISE_I32_MUL = 0; // If enabled, i64 math is done in i32 multiplication. This is necessary if the values
- // exceed the JS double-integer limit of ~52 bits. This option can normally be disabled
- // because generally i32 multiplication works ok without it, and enabling it has a big
- // impact on performance.
- // Note that you can hand-optimize your code to avoid the need for this: If you do
- // multiplications that actually need 64-bit precision inside 64-bit values, things
- // will work properly. (Unless the LLVM optimizer turns them into 32-bit values?)
+var PRECISE_I32_MUL = 1; // If enabled, i32 multiplication is done with full precision, which means it is
+ // correct even if the value exceeds the JS double-integer limit of ~52 bits (otherwise,
+ // rounding will occur above that range).
var CLOSURE_ANNOTATIONS = 0; // If set, the generated code will be annotated for the closure
// compiler. This potentially lets closure optimize the code better.
@@ -111,10 +107,11 @@ var SKIP_STACK_IN_SMALL = 1; // When enabled, does not push/pop the stack at all
// In particular, be careful with the autodebugger! (We do turn
// this off automatically in that case, though.)
var INLINE_LIBRARY_FUNCS = 1; // Will inline library functions that have __inline defined
-var INLINING_LIMIT = 50; // A limit on inlining. If 0, we will inline normally in LLVM and
+var INLINING_LIMIT = 0; // A limit on inlining. If 0, we will inline normally in LLVM and
// closure. If greater than 0, we will *not* inline in LLVM, and
// we will prevent inlining of functions of this size or larger
- // in closure.
+ // in closure. 50 is a reasonable setting if you do not want
+ // inlining
var CATCH_EXIT_CODE = 0; // If set, causes exit() to throw an exception object which is caught
// in a try..catch block and results in the exit status being
// returned from run(). If zero (the default), the program is just
@@ -132,8 +129,23 @@ var SAFE_HEAP = 0; // Check each write to the heap, for example, this will give
// that 3 is the option you usually want here.
var SAFE_HEAP_LOG = 0; // Log out all SAFE_HEAP operations
+var CHECK_HEAP_ALIGN = 0; // Check heap accesses for alignment, but don't do as
+ // near extensive (or slow) checks as SAFE_HEAP.
+
+var SAFE_DYNCALLS = 0; // Show stack traces on missing function pointer/virtual method calls
+
var ASM_HEAP_LOG = 0; // Simple heap logging, like SAFE_HEAP_LOG but cheaper, and in asm.js
+var CORRUPTION_CHECK = 0; // When enabled, will emit a buffer area at the beginning and
+ // end of each allocation on the heap, filled with canary
+ // values that can be checked later. Corruption is checked for
+ // at the end of each at each free() (see jsifier to add more, and you
+ // can add more manual checks by calling CorruptionChecker.checkAll).
+ // 0 means not enabled, higher values mean the size of the
+ // buffer areas as a multiple of the allocated area (so
+ // 1 means 100%, or buffer areas equal to allocated area,
+ // both before and after). This must be an integer.
+
var LABEL_DEBUG = 0; // 1: Print out functions as we enter them
// 2: Also print out each label as we enter it
var LABEL_FUNCTION_FILTERS = []; // Filters for function label debug.
@@ -152,9 +164,11 @@ var SOCKET_DEBUG = 0; // Log out socket/network data transfer.
var GL_DEBUG = 0; // Print out all calls into WebGL. As with LIBRARY_DEBUG, you can set a runtime
// option, in this case GL.debug.
+var GL_TESTING = 0; // When enabled, sets preserveDrawingBuffer in the context, to allow tests to work (but adds overhead)
var GL_MAX_TEMP_BUFFER_SIZE = 2097152; // How large GL emulation temp buffers are
-
-var PROFILE_MAIN_LOOP = 0; // Profile the function called in set_main_loop
+var GL_UNSAFE_OPTS = 1; // Enables some potentially-unsafe optimizations in GL emulation code
+var FULL_ES2 = 0; // Forces support for all GLES2 features, not just the WebGL-friendly subset.
+var FORCE_GL_EMULATION = 0; // Forces inclusion of full GL emulation code.
var DISABLE_EXCEPTION_CATCHING = 0; // Disables generating code to actually catch exceptions. If the code you
// are compiling does not actually rely on catching exceptions (but the
@@ -205,21 +219,10 @@ var FS_LOG = 0; // Log all FS operations. This is especially helpful when you'r
// a new project and want to see a list of file system operations happening
// so that you can create a virtual file system with all of the required files.
-var PGO = 0; // Profile-guided optimization.
- // When run with the CHECK_* options, will not fail on errors. Instead, will
- // keep a record of which checks succeeded and which failed. On shutdown, will
- // print out that information. This is useful for knowing which lines need
- // checking enabled and which do not, that is, this is a way to automate the
- // generation of line data for CORRECT_*_LINES options.
- // All CORRECT_* options default to 1 with PGO builds.
- // See https://github.com/kripken/emscripten/wiki/Optimizing-Code for more info
-
var NAMED_GLOBALS = 0; // If 1, we use global variables for globals. Otherwise
// they are referred to by a base plus an offset (called an indexed global),
// saving global variables but adding runtime overhead.
-var PROFILE = 0; // Enables runtime profiling. See test_profiling for a usage example.
-
var EXPORT_ALL = 0; // If true, we export all the symbols
var EXPORTED_FUNCTIONS = ['_main']; // Functions that are explicitly exported. These functions are kept alive
// through LLVM dead code elimination, and also made accessible outside of
@@ -327,12 +330,13 @@ var BENCHMARK = 0; // If 1, will just time how long main() takes to execute, and
var ASM_JS = 0; // If 1, generate code in asm.js format. XXX This is highly experimental,
// and will not work on most codebases yet. It is NOT recommended that you
// try this yet.
-var USE_MATH_IMUL = 0; // If 1, use Math.imul when useful
var EXPLICIT_ZEXT = 0; // If 1, generate an explicit conversion of zext i1 to i32, using ?:
var NECESSARY_BLOCKADDRS = []; // List of (function, block) for all block addresses that are taken.
+var EMIT_GENERATED_FUNCTIONS = 0; // whether to emit the list of generated functions, needed for external JS optimization passes
+
// Compiler debugging options
var DEBUG_TAGS_SHOWING = [];
// Some useful items:
diff --git a/src/shell.html b/src/shell.html
index 3a0171de..4f39b26a 100644
--- a/src/shell.html
+++ b/src/shell.html
@@ -32,6 +32,7 @@
var element = document.getElementById('output');
element.value = ''; // clear browser cache
return function(text) {
+ text = Array.prototype.slice.call(arguments).join(' ');
// These replacements are necessary if you render to raw HTML
//text = text.replace(/&/g, "&amp;");
//text = text.replace(/</g, "&lt;");
@@ -42,6 +43,7 @@
};
})(),
printErr: function(text) {
+ text = Array.prototype.slice.call(arguments).join(' ');
if (0) { // XXX disabled for safety typeof dump == 'function') {
dump(text + '\n'); // fast, straight to the real console
} else {
diff --git a/system/lib/libc.symbols b/system/lib/libc.symbols
index b98a79e4..d41f4140 100644
--- a/system/lib/libc.symbols
+++ b/system/lib/libc.symbols
@@ -48,8 +48,3 @@ _ZNSt20bad_array_new_lengthC2Ev
_ZNSt20bad_array_new_lengthD0Ev
_ZNSt20bad_array_new_lengthD1Ev
_ZNSt20bad_array_new_lengthD2Ev
-memcpy
-llvm.memcpy.i32
-llvm.memcpy.i64
-llvm.memcpy.p0i8.p0i8.i32
-llvm.memcpy.p0i8.p0i8.i64
diff --git a/system/lib/libcxx/symbols b/system/lib/libcxx/symbols
index 23d4a7a4..0d412de7 100644
--- a/system/lib/libcxx/symbols
+++ b/system/lib/libcxx/symbols
@@ -767,7 +767,6 @@
W _ZNKSt3__19money_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE3putES4_bRNS_8ios_baseEwe
W _ZNKSt3__19money_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4_bRNS_8ios_baseEwRKNS_12basic_stringIwS3_NS_9allocatorIwEEEE
W _ZNKSt3__19money_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4_bRNS_8ios_baseEwe
- T _ZNKSt8bad_cast4whatEv
T _ZNKSt9exception4whatEv
T _ZNSt10bad_typeidC1Ev
T _ZNSt10bad_typeidC2Ev
@@ -2561,11 +2560,6 @@
d _ZNSt3__1L7__wcoutE
d _ZNSt3__1L8__rs_mutE
W _ZNSt3__1plIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12basic_stringIT_T0_T1_EEPKS6_RKS9_
- T _ZNSt8bad_castC1Ev
- T _ZNSt8bad_castC2Ev
- T _ZNSt8bad_castD0Ev
- T _ZNSt8bad_castD1Ev
- T _ZNSt8bad_castD2Ev
T _ZNSt9exceptionD0Ev
T _ZNSt9exceptionD1Ev
T _ZNSt9exceptionD2Ev
@@ -2719,7 +2713,6 @@
D _ZTISt15underflow_error
D _ZTISt16invalid_argument
D _ZTISt16nested_exception
- D _ZTISt8bad_cast
D _ZTISt9exception
C _ZTSNSt3__110__stdinbufIcEE
C _ZTSNSt3__110__stdinbufIwEE
@@ -2855,7 +2848,6 @@
D _ZTSSt15underflow_error
D _ZTSSt16invalid_argument
D _ZTSSt16nested_exception
- D _ZTSSt8bad_cast
D _ZTSSt9exception
D _ZTTNSt3__110istrstreamE
D _ZTTNSt3__110ostrstreamE
@@ -2980,7 +2972,6 @@
D _ZTVSt15underflow_error
D _ZTVSt16invalid_argument
D _ZTVSt16nested_exception
- D _ZTVSt8bad_cast
D _ZTVSt9exception
W _ZThn8_NKSt3__115time_get_bynameIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE3__XEv
W _ZThn8_NKSt3__115time_get_bynameIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE3__cEv
diff --git a/system/lib/libcxxabi/symbols b/system/lib/libcxxabi/symbols
index 8ef205ba..b63f2f82 100644
--- a/system/lib/libcxxabi/symbols
+++ b/system/lib/libcxxabi/symbols
@@ -10,3 +10,10 @@
D _ZTVN10__cxxabiv121__vmi_class_type_infoE
D _ZTVN10__cxxabiv123__fundamental_type_infoE
D _ZTVN10__cxxabiv129__pointer_to_member_type_infoE
+ D _ZTSSt9type_info
+ T _ZNKSt8bad_cast4whatEv
+ T _ZNSt8bad_castC1Ev
+ T _ZNSt8bad_castC2Ev
+ D _ZTISt8bad_cast
+ D _ZTSSt8bad_cast
+ D _ZTVSt8bad_cast
diff --git a/tests/aniso.c b/tests/aniso.c
index e673e228..e02c20ac 100644
--- a/tests/aniso.c
+++ b/tests/aniso.c
@@ -145,6 +145,11 @@ int main(int argc, char *argv[])
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, aniso);
}
+ {
+ assert(!glGetError());
+ glBindFramebuffer(GL_RENDERBUFFER, 0);
+ assert(glGetError());
+ }
// Prepare and Render
diff --git a/tests/aniso.png b/tests/aniso.png
index 5f5812d2..2bcb2f5f 100644
--- a/tests/aniso.png
+++ b/tests/aniso.png
Binary files differ
diff --git a/tests/bullet/output3.txt b/tests/bullet/output3.txt
new file mode 100644
index 00000000..78f27f9f
--- /dev/null
+++ b/tests/bullet/output3.txt
@@ -0,0 +1,270 @@
+world pos = 2.00,10.00,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,9.99,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,9.98,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,9.97,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,9.96,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,9.94,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,9.92,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,9.90,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,9.88,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,9.85,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,9.82,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,9.78,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,9.75,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,9.71,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,9.67,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,9.62,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,9.57,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,9.52,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,9.47,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,9.42,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,9.36,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,9.30,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,9.23,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,9.17,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,9.10,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,9.02,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,8.95,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,8.87,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,8.79,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,8.71,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,8.62,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,8.53,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,8.44,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,8.35,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,8.25,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,8.15,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,8.05,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,7.94,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,7.83,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,7.72,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,7.61,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,7.49,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,7.37,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,7.25,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,7.13,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,7.00,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,6.87,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,6.73,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,6.60,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,6.46,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,6.32,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,6.17,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,6.03,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,5.88,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,5.72,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,5.57,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,5.41,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,5.25,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,5.08,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,4.92,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,4.75,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,4.58,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,4.40,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,4.22,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,4.04,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,3.86,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,3.67,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,3.48,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,3.29,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,3.10,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,2.90,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,2.70,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,2.50,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,2.29,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,2.08,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,1.87,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,1.66,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,1.44,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,1.22,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,1.00,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,0.77,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,0.55,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,0.32,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,0.08,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-0.15,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-0.39,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-0.63,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-0.88,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-1.13,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-1.38,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-1.63,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-1.88,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-2.14,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-2.40,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-2.67,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-2.93,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-3.20,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-3.48,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-3.75,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-4.03,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-4.31,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-4.59,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-4.88,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-5.17,0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-5.13,-0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-5.10,-0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-5.08,-0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-5.05,-0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-5.03,-0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-5.01,-0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-4.99,-0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-4.98,-0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-4.97,-0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-4.96,-0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-4.95,-0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-4.95,-0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-4.95,-0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-4.95,-0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-4.96,-0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-4.97,-0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-4.98,-0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-4.99,-0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-5.00,-0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-5.00,-0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-5.00,-0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-5.00,-0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-5.00,-0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-5.00,-0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-5.00,-0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-5.00,-0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-5.00,-0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-5.00,-0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-5.00,-0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-5.00,-0.00
+world pos = 0.00,-56.00,0.00
+world pos = 2.00,-5.00,-0.00
+world pos = 0.00,-56.00,0.00
diff --git a/tests/cases/atomicrmw.ll b/tests/cases/atomicrmw.ll
index 2f5a4224..fe479dce 100644
--- a/tests/cases/atomicrmw.ll
+++ b/tests/cases/atomicrmw.ll
@@ -13,6 +13,7 @@ entry:
%1 = atomicrmw add i32* %t, i32 3 seq_cst, ; [#uses=0 type=i32] [debug line = 21:12]
%2 = load i32* %t
%call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([15 x i8]* @.str, i32 0, i32 0), i32 %0, i32 %2) ; [#uses=0 type=i32]
+ %3 = atomicrmw volatile add i32* %t, i32 3 seq_cst, ; [#uses=0 type=i32] [debug line = 21:12]
ret i32 1
}
diff --git a/tests/cases/breakinthemiddle2.ll b/tests/cases/breakinthemiddle2.ll
new file mode 100644
index 00000000..318b49dc
--- /dev/null
+++ b/tests/cases/breakinthemiddle2.ll
@@ -0,0 +1,35 @@
+@.str = private constant [15 x i8] c"hello, world!\0A\00", align 1 ; [#uses=1]
+
+define linkonce_odr i32 @main() align 2 {
+ %333 = call i32 @printf(i8* getelementptr inbounds ([15 x i8]* @.str, i32 0, i32 0)) ; [#uses=0]
+ %199 = trunc i8 1 to i1 ; [#uses=1]
+ br i1 %199, label %label555, label %label569
+
+label555: ; preds = %0
+ br label %label569 ; branch should ignore all code after it in the block
+ ; No predecessors!
+ %a472 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
+ cleanup
+ %a473 = extractvalue { i8*, i32 } %a472, 0
+ %a474 = extractvalue { i8*, i32 } %a472, 1
+ br label %label569
+
+label569: ; preds = %0
+ br i1 %199, label %label990, label %label999
+
+label990:
+ ret i32 0 ; ret should ignore all code after it in the block
+ ; No predecessors!
+ %a472 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
+ cleanup
+ %a473 = extractvalue { i8*, i32 } %a472, 0
+ %a474 = extractvalue { i8*, i32 } %a472, 1
+ br label %label569
+
+label999: ; preds = %555
+ ret i32 0
+}
+
+declare i32 @printf(i8*)
+declare i32 @__gxx_personality_v0(...)
+
diff --git a/tests/cases/callalias.ll b/tests/cases/callalias.ll
new file mode 100644
index 00000000..9bc1ffd0
--- /dev/null
+++ b/tests/cases/callalias.ll
@@ -0,0 +1,21 @@
+; ModuleID = 'tests/hello_world.bc'
+target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32-S128"
+target triple = "i386-pc-linux-gnu"
+
+@.str = private unnamed_addr constant [15 x i8] c"hello, world!\0A\00", align 1 ; [#uses=1 type=[15 x i8]*]
+
+@othername = alias internal void ()* @doit
+
+define internal void @doit() unnamed_addr nounwind align 2 {
+ %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([15 x i8]* @.str, i32 0, i32 0)) ; [#uses=0 type=i32]
+ ret void
+}
+
+define i32 @main() {
+entry:
+ tail call void ()* @othername() nounwind
+ ret i32 1
+}
+
+declare i32 @printf(i8*, ...)
+
diff --git a/tests/cases/callalias2.ll b/tests/cases/callalias2.ll
new file mode 100644
index 00000000..abdbe4e6
--- /dev/null
+++ b/tests/cases/callalias2.ll
@@ -0,0 +1,22 @@
+; ModuleID = 'tests/hello_world.bc'
+target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32-S128"
+target triple = "i386-pc-linux-gnu"
+
+@.str = private unnamed_addr constant [15 x i8] c"hello, world!\0A\00", align 1 ; [#uses=1 type=[15 x i8]*]
+
+@othername = alias internal void ()* @doit
+@othername2 = alias internal void ()* @othername
+
+define internal void @doit() unnamed_addr nounwind align 2 {
+ %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([15 x i8]* @.str, i32 0, i32 0)) ; [#uses=0 type=i32]
+ ret void
+}
+
+define i32 @main() {
+entry:
+ tail call void ()* @othername2() nounwind
+ ret i32 1
+}
+
+declare i32 @printf(i8*, ...)
+
diff --git a/tests/cases/cmpxchg_volatile.ll b/tests/cases/cmpxchg_volatile.ll
new file mode 100644
index 00000000..019fd833
--- /dev/null
+++ b/tests/cases/cmpxchg_volatile.ll
@@ -0,0 +1,548 @@
+; ModuleID = 'ta2.bc'
+target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32-S128"
+target triple = "i386-pc-linux-gnu"
+
+%"struct.std::__1::__atomic_base.0" = type { i8 }
+%"struct.std::__1::__atomic_base" = type { %"struct.std::__1::__atomic_base.0" }
+%"struct.std::__1::atomic" = type { %"struct.std::__1::__atomic_base" }
+
+@.str = private unnamed_addr constant [8 x i8] c"ta2.cpp\00", align 1
+@__PRETTY_FUNCTION__._Z7do_testIVNSt3__16atomicIcEEcEvv = private unnamed_addr constant [63 x i8] c"void do_test() [A = volatile std::__1::atomic<char>, T = char]\00", align 1
+@.str1 = private unnamed_addr constant [43 x i8] c"obj.compare_exchange_weak(x, T(2)) == true\00", align 1
+@.str2 = private unnamed_addr constant [12 x i8] c"obj == T(2)\00", align 1
+@.str3 = private unnamed_addr constant [10 x i8] c"x == T(3)\00", align 1
+@.str4 = private unnamed_addr constant [44 x i8] c"obj.compare_exchange_weak(x, T(1)) == false\00", align 1
+@.str5 = private unnamed_addr constant [10 x i8] c"x == T(2)\00", align 1
+@.str6 = private unnamed_addr constant [45 x i8] c"obj.compare_exchange_strong(x, T(1)) == true\00", align 1
+@.str7 = private unnamed_addr constant [12 x i8] c"obj == T(1)\00", align 1
+@.str8 = private unnamed_addr constant [15 x i8] c"hello, world!\0A\00", align 1 ; [#uses=1 type=[15 x i8]*]
+
+define i32 @main() ssp {
+entry:
+ %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([15 x i8]* @.str8, i32 0, i32 0)) ; [#uses=0 type=i32]
+ call void @_Z4testIVNSt3__16atomicIcEEcEvv()
+ ret i32 0
+}
+
+define linkonce_odr void @_Z4testIVNSt3__16atomicIcEEcEvv() ssp {
+entry:
+ call void @_Z7do_testIVNSt3__16atomicIcEEcEvv()
+ call void @_Z7do_testIVNSt3__16atomicIcEEcEvv()
+ ret void
+}
+
+define linkonce_odr void @_Z7do_testIVNSt3__16atomicIcEEcEvv() ssp {
+entry:
+ %this.addr.i.i110 = alloca %"struct.std::__1::__atomic_base.0"*, align 4
+ %__m.addr.i.i111 = alloca i32, align 4
+ %.atomicdst.i.i112 = alloca i8, align 1
+ %this.addr.i113 = alloca %"struct.std::__1::__atomic_base.0"*, align 4
+ %this.addr.i90 = alloca %"struct.std::__1::__atomic_base.0"*, align 4
+ %__e.addr.i91 = alloca i8*, align 4
+ %__d.addr.i92 = alloca i8, align 1
+ %__m.addr.i93 = alloca i32, align 4
+ %.atomictmp.i94 = alloca i8, align 1
+ %.atomicdst.i95 = alloca i8, align 1
+ %this.addr.i.i79 = alloca %"struct.std::__1::__atomic_base.0"*, align 4
+ %__m.addr.i.i80 = alloca i32, align 4
+ %.atomicdst.i.i81 = alloca i8, align 1
+ %this.addr.i82 = alloca %"struct.std::__1::__atomic_base.0"*, align 4
+ %this.addr.i60 = alloca %"struct.std::__1::__atomic_base.0"*, align 4
+ %__e.addr.i61 = alloca i8*, align 4
+ %__d.addr.i62 = alloca i8, align 1
+ %__m.addr.i63 = alloca i32, align 4
+ %.atomictmp.i64 = alloca i8, align 1
+ %.atomicdst.i65 = alloca i8, align 1
+ %this.addr.i.i49 = alloca %"struct.std::__1::__atomic_base.0"*, align 4
+ %__m.addr.i.i50 = alloca i32, align 4
+ %.atomicdst.i.i51 = alloca i8, align 1
+ %this.addr.i52 = alloca %"struct.std::__1::__atomic_base.0"*, align 4
+ %this.addr.i46 = alloca %"struct.std::__1::__atomic_base.0"*, align 4
+ %__e.addr.i = alloca i8*, align 4
+ %__d.addr.i47 = alloca i8, align 1
+ %__m.addr.i = alloca i32, align 4
+ %.atomictmp.i = alloca i8, align 1
+ %.atomicdst.i = alloca i8, align 1
+ %this.addr.i.i42 = alloca %"struct.std::__1::__atomic_base.0"*, align 4
+ %__m.addr.i.i = alloca i32, align 4
+ %.atomicdst.i.i = alloca i8, align 1
+ %this.addr.i43 = alloca %"struct.std::__1::__atomic_base.0"*, align 4
+ %this.addr.i.i.i.i = alloca %"struct.std::__1::__atomic_base.0"*, align 4
+ %__d.addr.i.i.i.i = alloca i8, align 1
+ %this.addr.i.i.i = alloca %"struct.std::__1::__atomic_base"*, align 4
+ %__d.addr.i.i.i = alloca i8, align 1
+ %this.addr.i.i = alloca %"struct.std::__1::atomic"*, align 4
+ %__d.addr.i.i = alloca i8, align 1
+ %this.addr.i = alloca %"struct.std::__1::atomic"*, align 4
+ %__d.addr.i = alloca i8, align 1
+ %obj = alloca %"struct.std::__1::atomic", align 1
+ %x = alloca i8, align 1
+ store %"struct.std::__1::atomic"* %obj, %"struct.std::__1::atomic"** %this.addr.i, align 4
+ store i8 0, i8* %__d.addr.i, align 1
+ %this1.i = load %"struct.std::__1::atomic"** %this.addr.i
+ %0 = load i8* %__d.addr.i, align 1
+ store %"struct.std::__1::atomic"* %this1.i, %"struct.std::__1::atomic"** %this.addr.i.i, align 4
+ store i8 %0, i8* %__d.addr.i.i, align 1
+ %this1.i.i = load %"struct.std::__1::atomic"** %this.addr.i.i
+ %1 = bitcast %"struct.std::__1::atomic"* %this1.i.i to %"struct.std::__1::__atomic_base"*
+ %2 = load i8* %__d.addr.i.i, align 1
+ store %"struct.std::__1::__atomic_base"* %1, %"struct.std::__1::__atomic_base"** %this.addr.i.i.i, align 4
+ store i8 %2, i8* %__d.addr.i.i.i, align 1
+ %this1.i.i.i = load %"struct.std::__1::__atomic_base"** %this.addr.i.i.i
+ %3 = bitcast %"struct.std::__1::__atomic_base"* %this1.i.i.i to %"struct.std::__1::__atomic_base.0"*
+ %4 = load i8* %__d.addr.i.i.i, align 1
+ store %"struct.std::__1::__atomic_base.0"* %3, %"struct.std::__1::__atomic_base.0"** %this.addr.i.i.i.i, align 4
+ store i8 %4, i8* %__d.addr.i.i.i.i, align 1
+ %this1.i.i.i.i = load %"struct.std::__1::__atomic_base.0"** %this.addr.i.i.i.i
+ %__a_.i.i.i.i = getelementptr inbounds %"struct.std::__1::__atomic_base.0"* %this1.i.i.i.i, i32 0, i32 0
+ %5 = load i8* %__d.addr.i.i.i.i, align 1
+ store i8 %5, i8* %__a_.i.i.i.i, align 1
+ %6 = bitcast %"struct.std::__1::atomic"* %obj to %"struct.std::__1::__atomic_base.0"*
+ store %"struct.std::__1::__atomic_base.0"* %6, %"struct.std::__1::__atomic_base.0"** %this.addr.i113, align 4
+ %this1.i114 = load %"struct.std::__1::__atomic_base.0"** %this.addr.i113
+ store %"struct.std::__1::__atomic_base.0"* %this1.i114, %"struct.std::__1::__atomic_base.0"** %this.addr.i.i110, align 4
+ store i32 5, i32* %__m.addr.i.i111, align 4
+ %this1.i.i115 = load %"struct.std::__1::__atomic_base.0"** %this.addr.i.i110
+ %__a_.i.i116 = getelementptr inbounds %"struct.std::__1::__atomic_base.0"* %this1.i.i115, i32 0, i32 0
+ %7 = load i32* %__m.addr.i.i111, align 4
+ switch i32 %7, label %monotonic.i.i117 [
+ i32 1, label %acquire.i.i118
+ i32 2, label %acquire.i.i118
+ i32 5, label %seqcst.i.i119
+ ]
+
+monotonic.i.i117: ; preds = %entry
+ %8 = load atomic volatile i8* %__a_.i.i116 monotonic, align 1
+ store i8 %8, i8* %.atomicdst.i.i112, align 1
+ br label %_ZNVKSt3__113__atomic_baseIcLb0EEcvcEv.exit120
+
+acquire.i.i118: ; preds = %entry, %entry
+ %9 = load atomic volatile i8* %__a_.i.i116 acquire, align 1
+ store i8 %9, i8* %.atomicdst.i.i112, align 1
+ br label %_ZNVKSt3__113__atomic_baseIcLb0EEcvcEv.exit120
+
+seqcst.i.i119: ; preds = %entry
+ %10 = load atomic volatile i8* %__a_.i.i116 seq_cst, align 1
+ store i8 %10, i8* %.atomicdst.i.i112, align 1
+ br label %_ZNVKSt3__113__atomic_baseIcLb0EEcvcEv.exit120
+
+_ZNVKSt3__113__atomic_baseIcLb0EEcvcEv.exit120: ; preds = %seqcst.i.i119, %acquire.i.i118, %monotonic.i.i117
+ %11 = load i8* %.atomicdst.i.i112
+ store i8 %11, i8* %x, align 1
+ %12 = bitcast %"struct.std::__1::atomic"* %obj to %"struct.std::__1::__atomic_base.0"*
+ store %"struct.std::__1::__atomic_base.0"* %12, %"struct.std::__1::__atomic_base.0"** %this.addr.i90, align 4
+ store i8* %x, i8** %__e.addr.i91, align 4
+ store i8 2, i8* %__d.addr.i92, align 1
+ store i32 5, i32* %__m.addr.i93, align 4
+ %this1.i96 = load %"struct.std::__1::__atomic_base.0"** %this.addr.i90
+ %__a_.i97 = getelementptr inbounds %"struct.std::__1::__atomic_base.0"* %this1.i96, i32 0, i32 0
+ %13 = load i32* %__m.addr.i93, align 4
+ %14 = load i8** %__e.addr.i91, align 4
+ %15 = load i8* %__d.addr.i92, align 1
+ store i8 %15, i8* %.atomictmp.i94
+ %16 = load i32* %__m.addr.i93, align 4
+ switch i32 %13, label %monotonic.i99 [
+ i32 1, label %acquire.i101
+ i32 2, label %acquire.i101
+ i32 3, label %release.i103
+ i32 4, label %acqrel.i105
+ i32 5, label %seqcst.i107
+ ]
+
+monotonic.i99: ; preds = %_ZNVKSt3__113__atomic_baseIcLb0EEcvcEv.exit120
+ %17 = load i8* %14, align 1
+ %18 = load i8* %.atomictmp.i94, align 1
+ %19 = cmpxchg volatile i8* %__a_.i97, i8 %17, i8 %18 monotonic
+ store i8 %19, i8* %14, align 1
+ %20 = icmp eq i8 %19, %17
+ %frombool.i98 = zext i1 %20 to i8
+ store i8 %frombool.i98, i8* %.atomicdst.i95
+ br label %_ZNVSt3__113__atomic_baseIcLb0EE21compare_exchange_weakERccNS_12memory_orderE.exit109
+
+acquire.i101: ; preds = %_ZNVKSt3__113__atomic_baseIcLb0EEcvcEv.exit120, %_ZNVKSt3__113__atomic_baseIcLb0EEcvcEv.exit120
+ %21 = load i8* %14, align 1
+ %22 = load i8* %.atomictmp.i94, align 1
+ %23 = cmpxchg volatile i8* %__a_.i97, i8 %21, i8 %22 acquire
+ store i8 %23, i8* %14, align 1
+ %24 = icmp eq i8 %23, %21
+ %frombool2.i100 = zext i1 %24 to i8
+ store i8 %frombool2.i100, i8* %.atomicdst.i95
+ br label %_ZNVSt3__113__atomic_baseIcLb0EE21compare_exchange_weakERccNS_12memory_orderE.exit109
+
+release.i103: ; preds = %_ZNVKSt3__113__atomic_baseIcLb0EEcvcEv.exit120
+ %25 = load i8* %14, align 1
+ %26 = load i8* %.atomictmp.i94, align 1
+ %27 = cmpxchg volatile i8* %__a_.i97, i8 %25, i8 %26 release
+ store i8 %27, i8* %14, align 1
+ %28 = icmp eq i8 %27, %25
+ %frombool3.i102 = zext i1 %28 to i8
+ store i8 %frombool3.i102, i8* %.atomicdst.i95
+ br label %_ZNVSt3__113__atomic_baseIcLb0EE21compare_exchange_weakERccNS_12memory_orderE.exit109
+
+acqrel.i105: ; preds = %_ZNVKSt3__113__atomic_baseIcLb0EEcvcEv.exit120
+ %29 = load i8* %14, align 1
+ %30 = load i8* %.atomictmp.i94, align 1
+ %31 = cmpxchg volatile i8* %__a_.i97, i8 %29, i8 %30 acq_rel
+ store i8 %31, i8* %14, align 1
+ %32 = icmp eq i8 %31, %29
+ %frombool4.i104 = zext i1 %32 to i8
+ store i8 %frombool4.i104, i8* %.atomicdst.i95
+ br label %_ZNVSt3__113__atomic_baseIcLb0EE21compare_exchange_weakERccNS_12memory_orderE.exit109
+
+seqcst.i107: ; preds = %_ZNVKSt3__113__atomic_baseIcLb0EEcvcEv.exit120
+ %33 = load i8* %14, align 1
+ %34 = load i8* %.atomictmp.i94, align 1
+ %35 = cmpxchg volatile i8* %__a_.i97, i8 %33, i8 %34 seq_cst
+ store i8 %35, i8* %14, align 1
+ %36 = icmp eq i8 %35, %33
+ %frombool5.i106 = zext i1 %36 to i8
+ store i8 %frombool5.i106, i8* %.atomicdst.i95
+ br label %_ZNVSt3__113__atomic_baseIcLb0EE21compare_exchange_weakERccNS_12memory_orderE.exit109
+
+_ZNVSt3__113__atomic_baseIcLb0EE21compare_exchange_weakERccNS_12memory_orderE.exit109: ; preds = %seqcst.i107, %acqrel.i105, %release.i103, %acquire.i101, %monotonic.i99
+ %37 = load i8* %.atomicdst.i95
+ %tobool.i108 = trunc i8 %37 to i1
+ %conv = zext i1 %tobool.i108 to i32
+ %cmp = icmp eq i32 %conv, 1
+ br i1 %cmp, label %cond.true, label %cond.false
+
+cond.true: ; preds = %_ZNVSt3__113__atomic_baseIcLb0EE21compare_exchange_weakERccNS_12memory_orderE.exit109
+ br label %cond.end
+
+cond.false: ; preds = %_ZNVSt3__113__atomic_baseIcLb0EE21compare_exchange_weakERccNS_12memory_orderE.exit109
+ call void @__assert_func(i8* getelementptr inbounds ([8 x i8]* @.str, i32 0, i32 0), i32 21, i8* getelementptr inbounds ([63 x i8]* @__PRETTY_FUNCTION__._Z7do_testIVNSt3__16atomicIcEEcEvv, i32 0, i32 0), i8* getelementptr inbounds ([43 x i8]* @.str1, i32 0, i32 0))
+ br label %cond.end
+
+cond.end: ; preds = %cond.false, %cond.true
+ %38 = bitcast %"struct.std::__1::atomic"* %obj to %"struct.std::__1::__atomic_base.0"*
+ store %"struct.std::__1::__atomic_base.0"* %38, %"struct.std::__1::__atomic_base.0"** %this.addr.i82, align 4
+ %this1.i83 = load %"struct.std::__1::__atomic_base.0"** %this.addr.i82
+ store %"struct.std::__1::__atomic_base.0"* %this1.i83, %"struct.std::__1::__atomic_base.0"** %this.addr.i.i79, align 4
+ store i32 5, i32* %__m.addr.i.i80, align 4
+ %this1.i.i84 = load %"struct.std::__1::__atomic_base.0"** %this.addr.i.i79
+ %__a_.i.i85 = getelementptr inbounds %"struct.std::__1::__atomic_base.0"* %this1.i.i84, i32 0, i32 0
+ %39 = load i32* %__m.addr.i.i80, align 4
+ switch i32 %39, label %monotonic.i.i86 [
+ i32 1, label %acquire.i.i87
+ i32 2, label %acquire.i.i87
+ i32 5, label %seqcst.i.i88
+ ]
+
+monotonic.i.i86: ; preds = %cond.end
+ %40 = load atomic volatile i8* %__a_.i.i85 monotonic, align 1
+ store i8 %40, i8* %.atomicdst.i.i81, align 1
+ br label %_ZNVKSt3__113__atomic_baseIcLb0EEcvcEv.exit89
+
+acquire.i.i87: ; preds = %cond.end, %cond.end
+ %41 = load atomic volatile i8* %__a_.i.i85 acquire, align 1
+ store i8 %41, i8* %.atomicdst.i.i81, align 1
+ br label %_ZNVKSt3__113__atomic_baseIcLb0EEcvcEv.exit89
+
+seqcst.i.i88: ; preds = %cond.end
+ %42 = load atomic volatile i8* %__a_.i.i85 seq_cst, align 1
+ store i8 %42, i8* %.atomicdst.i.i81, align 1
+ br label %_ZNVKSt3__113__atomic_baseIcLb0EEcvcEv.exit89
+
+_ZNVKSt3__113__atomic_baseIcLb0EEcvcEv.exit89: ; preds = %seqcst.i.i88, %acquire.i.i87, %monotonic.i.i86
+ %43 = load i8* %.atomicdst.i.i81
+ %conv3 = sext i8 %43 to i32
+ %cmp4 = icmp eq i32 %conv3, 2
+ br i1 %cmp4, label %cond.true5, label %cond.false6
+
+cond.true5: ; preds = %_ZNVKSt3__113__atomic_baseIcLb0EEcvcEv.exit89
+ br label %cond.end7
+
+cond.false6: ; preds = %_ZNVKSt3__113__atomic_baseIcLb0EEcvcEv.exit89
+ call void @__assert_func(i8* getelementptr inbounds ([8 x i8]* @.str, i32 0, i32 0), i32 22, i8* getelementptr inbounds ([63 x i8]* @__PRETTY_FUNCTION__._Z7do_testIVNSt3__16atomicIcEEcEvv, i32 0, i32 0), i8* getelementptr inbounds ([12 x i8]* @.str2, i32 0, i32 0))
+ br label %cond.end7
+
+cond.end7: ; preds = %cond.false6, %cond.true5
+ %44 = load i8* %x, align 1
+ %conv8 = sext i8 %44 to i32
+ %cmp9 = icmp eq i32 %conv8, 3
+ br i1 %cmp9, label %cond.true10, label %cond.false11
+
+cond.true10: ; preds = %cond.end7
+ br label %cond.end12
+
+cond.false11: ; preds = %cond.end7
+ call void @__assert_func(i8* getelementptr inbounds ([8 x i8]* @.str, i32 0, i32 0), i32 23, i8* getelementptr inbounds ([63 x i8]* @__PRETTY_FUNCTION__._Z7do_testIVNSt3__16atomicIcEEcEvv, i32 0, i32 0), i8* getelementptr inbounds ([10 x i8]* @.str3, i32 0, i32 0))
+ br label %cond.end12
+
+cond.end12: ; preds = %cond.false11, %cond.true10
+ %45 = bitcast %"struct.std::__1::atomic"* %obj to %"struct.std::__1::__atomic_base.0"*
+ store %"struct.std::__1::__atomic_base.0"* %45, %"struct.std::__1::__atomic_base.0"** %this.addr.i60, align 4
+ store i8* %x, i8** %__e.addr.i61, align 4
+ store i8 1, i8* %__d.addr.i62, align 1
+ store i32 5, i32* %__m.addr.i63, align 4
+ %this1.i66 = load %"struct.std::__1::__atomic_base.0"** %this.addr.i60
+ %__a_.i67 = getelementptr inbounds %"struct.std::__1::__atomic_base.0"* %this1.i66, i32 0, i32 0
+ %46 = load i32* %__m.addr.i63, align 4
+ %47 = load i8** %__e.addr.i61, align 4
+ %48 = load i8* %__d.addr.i62, align 1
+ store i8 %48, i8* %.atomictmp.i64
+ %49 = load i32* %__m.addr.i63, align 4
+ switch i32 %46, label %monotonic.i69 [
+ i32 1, label %acquire.i71
+ i32 2, label %acquire.i71
+ i32 3, label %release.i73
+ i32 4, label %acqrel.i75
+ i32 5, label %seqcst.i77
+ ]
+
+monotonic.i69: ; preds = %cond.end12
+ %50 = load i8* %47, align 1
+ %51 = load i8* %.atomictmp.i64, align 1
+ %52 = cmpxchg volatile i8* %__a_.i67, i8 %50, i8 %51 monotonic
+ store i8 %52, i8* %47, align 1
+ %53 = icmp eq i8 %52, %50
+ %frombool.i68 = zext i1 %53 to i8
+ store i8 %frombool.i68, i8* %.atomicdst.i65
+ br label %_ZNVSt3__113__atomic_baseIcLb0EE21compare_exchange_weakERccNS_12memory_orderE.exit
+
+acquire.i71: ; preds = %cond.end12, %cond.end12
+ %54 = load i8* %47, align 1
+ %55 = load i8* %.atomictmp.i64, align 1
+ %56 = cmpxchg volatile i8* %__a_.i67, i8 %54, i8 %55 acquire
+ store i8 %56, i8* %47, align 1
+ %57 = icmp eq i8 %56, %54
+ %frombool2.i70 = zext i1 %57 to i8
+ store i8 %frombool2.i70, i8* %.atomicdst.i65
+ br label %_ZNVSt3__113__atomic_baseIcLb0EE21compare_exchange_weakERccNS_12memory_orderE.exit
+
+release.i73: ; preds = %cond.end12
+ %58 = load i8* %47, align 1
+ %59 = load i8* %.atomictmp.i64, align 1
+ %60 = cmpxchg volatile i8* %__a_.i67, i8 %58, i8 %59 release
+ store i8 %60, i8* %47, align 1
+ %61 = icmp eq i8 %60, %58
+ %frombool3.i72 = zext i1 %61 to i8
+ store i8 %frombool3.i72, i8* %.atomicdst.i65
+ br label %_ZNVSt3__113__atomic_baseIcLb0EE21compare_exchange_weakERccNS_12memory_orderE.exit
+
+acqrel.i75: ; preds = %cond.end12
+ %62 = load i8* %47, align 1
+ %63 = load i8* %.atomictmp.i64, align 1
+ %64 = cmpxchg volatile i8* %__a_.i67, i8 %62, i8 %63 acq_rel
+ store i8 %64, i8* %47, align 1
+ %65 = icmp eq i8 %64, %62
+ %frombool4.i74 = zext i1 %65 to i8
+ store i8 %frombool4.i74, i8* %.atomicdst.i65
+ br label %_ZNVSt3__113__atomic_baseIcLb0EE21compare_exchange_weakERccNS_12memory_orderE.exit
+
+seqcst.i77: ; preds = %cond.end12
+ %66 = load i8* %47, align 1
+ %67 = load i8* %.atomictmp.i64, align 1
+ %68 = cmpxchg volatile i8* %__a_.i67, i8 %66, i8 %67 seq_cst
+ store i8 %68, i8* %47, align 1
+ %69 = icmp eq i8 %68, %66
+ %frombool5.i76 = zext i1 %69 to i8
+ store i8 %frombool5.i76, i8* %.atomicdst.i65
+ br label %_ZNVSt3__113__atomic_baseIcLb0EE21compare_exchange_weakERccNS_12memory_orderE.exit
+
+_ZNVSt3__113__atomic_baseIcLb0EE21compare_exchange_weakERccNS_12memory_orderE.exit: ; preds = %seqcst.i77, %acqrel.i75, %release.i73, %acquire.i71, %monotonic.i69
+ %70 = load i8* %.atomicdst.i65
+ %tobool.i78 = trunc i8 %70 to i1
+ %conv14 = zext i1 %tobool.i78 to i32
+ %cmp15 = icmp eq i32 %conv14, 0
+ br i1 %cmp15, label %cond.true16, label %cond.false17
+
+cond.true16: ; preds = %_ZNVSt3__113__atomic_baseIcLb0EE21compare_exchange_weakERccNS_12memory_orderE.exit
+ br label %cond.end18
+
+cond.false17: ; preds = %_ZNVSt3__113__atomic_baseIcLb0EE21compare_exchange_weakERccNS_12memory_orderE.exit
+ call void @__assert_func(i8* getelementptr inbounds ([8 x i8]* @.str, i32 0, i32 0), i32 24, i8* getelementptr inbounds ([63 x i8]* @__PRETTY_FUNCTION__._Z7do_testIVNSt3__16atomicIcEEcEvv, i32 0, i32 0), i8* getelementptr inbounds ([44 x i8]* @.str4, i32 0, i32 0))
+ br label %cond.end18
+
+cond.end18: ; preds = %cond.false17, %cond.true16
+ %71 = bitcast %"struct.std::__1::atomic"* %obj to %"struct.std::__1::__atomic_base.0"*
+ store %"struct.std::__1::__atomic_base.0"* %71, %"struct.std::__1::__atomic_base.0"** %this.addr.i52, align 4
+ %this1.i53 = load %"struct.std::__1::__atomic_base.0"** %this.addr.i52
+ store %"struct.std::__1::__atomic_base.0"* %this1.i53, %"struct.std::__1::__atomic_base.0"** %this.addr.i.i49, align 4
+ store i32 5, i32* %__m.addr.i.i50, align 4
+ %this1.i.i54 = load %"struct.std::__1::__atomic_base.0"** %this.addr.i.i49
+ %__a_.i.i55 = getelementptr inbounds %"struct.std::__1::__atomic_base.0"* %this1.i.i54, i32 0, i32 0
+ %72 = load i32* %__m.addr.i.i50, align 4
+ switch i32 %72, label %monotonic.i.i56 [
+ i32 1, label %acquire.i.i57
+ i32 2, label %acquire.i.i57
+ i32 5, label %seqcst.i.i58
+ ]
+
+monotonic.i.i56: ; preds = %cond.end18
+ %73 = load atomic volatile i8* %__a_.i.i55 monotonic, align 1
+ store i8 %73, i8* %.atomicdst.i.i51, align 1
+ br label %_ZNVKSt3__113__atomic_baseIcLb0EEcvcEv.exit59
+
+acquire.i.i57: ; preds = %cond.end18, %cond.end18
+ %74 = load atomic volatile i8* %__a_.i.i55 acquire, align 1
+ store i8 %74, i8* %.atomicdst.i.i51, align 1
+ br label %_ZNVKSt3__113__atomic_baseIcLb0EEcvcEv.exit59
+
+seqcst.i.i58: ; preds = %cond.end18
+ %75 = load atomic volatile i8* %__a_.i.i55 seq_cst, align 1
+ store i8 %75, i8* %.atomicdst.i.i51, align 1
+ br label %_ZNVKSt3__113__atomic_baseIcLb0EEcvcEv.exit59
+
+_ZNVKSt3__113__atomic_baseIcLb0EEcvcEv.exit59: ; preds = %seqcst.i.i58, %acquire.i.i57, %monotonic.i.i56
+ %76 = load i8* %.atomicdst.i.i51
+ %conv20 = sext i8 %76 to i32
+ %cmp21 = icmp eq i32 %conv20, 2
+ br i1 %cmp21, label %cond.true22, label %cond.false23
+
+cond.true22: ; preds = %_ZNVKSt3__113__atomic_baseIcLb0EEcvcEv.exit59
+ br label %cond.end24
+
+cond.false23: ; preds = %_ZNVKSt3__113__atomic_baseIcLb0EEcvcEv.exit59
+ call void @__assert_func(i8* getelementptr inbounds ([8 x i8]* @.str, i32 0, i32 0), i32 25, i8* getelementptr inbounds ([63 x i8]* @__PRETTY_FUNCTION__._Z7do_testIVNSt3__16atomicIcEEcEvv, i32 0, i32 0), i8* getelementptr inbounds ([12 x i8]* @.str2, i32 0, i32 0))
+ br label %cond.end24
+
+cond.end24: ; preds = %cond.false23, %cond.true22
+ %77 = load i8* %x, align 1
+ %conv25 = sext i8 %77 to i32
+ %cmp26 = icmp eq i32 %conv25, 2
+ br i1 %cmp26, label %cond.true27, label %cond.false28
+
+cond.true27: ; preds = %cond.end24
+ br label %cond.end29
+
+cond.false28: ; preds = %cond.end24
+ call void @__assert_func(i8* getelementptr inbounds ([8 x i8]* @.str, i32 0, i32 0), i32 26, i8* getelementptr inbounds ([63 x i8]* @__PRETTY_FUNCTION__._Z7do_testIVNSt3__16atomicIcEEcEvv, i32 0, i32 0), i8* getelementptr inbounds ([10 x i8]* @.str5, i32 0, i32 0))
+ br label %cond.end29
+
+cond.end29: ; preds = %cond.false28, %cond.true27
+ store i8 2, i8* %x, align 1
+ %78 = bitcast %"struct.std::__1::atomic"* %obj to %"struct.std::__1::__atomic_base.0"*
+ store %"struct.std::__1::__atomic_base.0"* %78, %"struct.std::__1::__atomic_base.0"** %this.addr.i46, align 4
+ store i8* %x, i8** %__e.addr.i, align 4
+ store i8 1, i8* %__d.addr.i47, align 1
+ store i32 5, i32* %__m.addr.i, align 4
+ %this1.i48 = load %"struct.std::__1::__atomic_base.0"** %this.addr.i46
+ %__a_.i = getelementptr inbounds %"struct.std::__1::__atomic_base.0"* %this1.i48, i32 0, i32 0
+ %79 = load i32* %__m.addr.i, align 4
+ %80 = load i8** %__e.addr.i, align 4
+ %81 = load i8* %__d.addr.i47, align 1
+ store i8 %81, i8* %.atomictmp.i
+ %82 = load i32* %__m.addr.i, align 4
+ switch i32 %79, label %monotonic.i [
+ i32 1, label %acquire.i
+ i32 2, label %acquire.i
+ i32 3, label %release.i
+ i32 4, label %acqrel.i
+ i32 5, label %seqcst.i
+ ]
+
+monotonic.i: ; preds = %cond.end29
+ %83 = load i8* %80, align 1
+ %84 = load i8* %.atomictmp.i, align 1
+ %85 = cmpxchg volatile i8* %__a_.i, i8 %83, i8 %84 monotonic
+ store i8 %85, i8* %80, align 1
+ %86 = icmp eq i8 %85, %83
+ %frombool.i = zext i1 %86 to i8
+ store i8 %frombool.i, i8* %.atomicdst.i
+ br label %_ZNVSt3__113__atomic_baseIcLb0EE23compare_exchange_strongERccNS_12memory_orderE.exit
+
+acquire.i: ; preds = %cond.end29, %cond.end29
+ %87 = load i8* %80, align 1
+ %88 = load i8* %.atomictmp.i, align 1
+ %89 = cmpxchg volatile i8* %__a_.i, i8 %87, i8 %88 acquire
+ store i8 %89, i8* %80, align 1
+ %90 = icmp eq i8 %89, %87
+ %frombool2.i = zext i1 %90 to i8
+ store i8 %frombool2.i, i8* %.atomicdst.i
+ br label %_ZNVSt3__113__atomic_baseIcLb0EE23compare_exchange_strongERccNS_12memory_orderE.exit
+
+release.i: ; preds = %cond.end29
+ %91 = load i8* %80, align 1
+ %92 = load i8* %.atomictmp.i, align 1
+ %93 = cmpxchg volatile i8* %__a_.i, i8 %91, i8 %92 release
+ store i8 %93, i8* %80, align 1
+ %94 = icmp eq i8 %93, %91
+ %frombool3.i = zext i1 %94 to i8
+ store i8 %frombool3.i, i8* %.atomicdst.i
+ br label %_ZNVSt3__113__atomic_baseIcLb0EE23compare_exchange_strongERccNS_12memory_orderE.exit
+
+acqrel.i: ; preds = %cond.end29
+ %95 = load i8* %80, align 1
+ %96 = load i8* %.atomictmp.i, align 1
+ %97 = cmpxchg volatile i8* %__a_.i, i8 %95, i8 %96 acq_rel
+ store i8 %97, i8* %80, align 1
+ %98 = icmp eq i8 %97, %95
+ %frombool4.i = zext i1 %98 to i8
+ store i8 %frombool4.i, i8* %.atomicdst.i
+ br label %_ZNVSt3__113__atomic_baseIcLb0EE23compare_exchange_strongERccNS_12memory_orderE.exit
+
+seqcst.i: ; preds = %cond.end29
+ %99 = load i8* %80, align 1
+ %100 = load i8* %.atomictmp.i, align 1
+ %101 = cmpxchg volatile i8* %__a_.i, i8 %99, i8 %100 seq_cst
+ store i8 %101, i8* %80, align 1
+ %102 = icmp eq i8 %101, %99
+ %frombool5.i = zext i1 %102 to i8
+ store i8 %frombool5.i, i8* %.atomicdst.i
+ br label %_ZNVSt3__113__atomic_baseIcLb0EE23compare_exchange_strongERccNS_12memory_orderE.exit
+
+_ZNVSt3__113__atomic_baseIcLb0EE23compare_exchange_strongERccNS_12memory_orderE.exit: ; preds = %seqcst.i, %acqrel.i, %release.i, %acquire.i, %monotonic.i
+ %103 = load i8* %.atomicdst.i
+ %tobool.i = trunc i8 %103 to i1
+ %conv31 = zext i1 %tobool.i to i32
+ %cmp32 = icmp eq i32 %conv31, 1
+ br i1 %cmp32, label %cond.true33, label %cond.false34
+
+cond.true33: ; preds = %_ZNVSt3__113__atomic_baseIcLb0EE23compare_exchange_strongERccNS_12memory_orderE.exit
+ br label %cond.end35
+
+cond.false34: ; preds = %_ZNVSt3__113__atomic_baseIcLb0EE23compare_exchange_strongERccNS_12memory_orderE.exit
+ call void @__assert_func(i8* getelementptr inbounds ([8 x i8]* @.str, i32 0, i32 0), i32 28, i8* getelementptr inbounds ([63 x i8]* @__PRETTY_FUNCTION__._Z7do_testIVNSt3__16atomicIcEEcEvv, i32 0, i32 0), i8* getelementptr inbounds ([45 x i8]* @.str6, i32 0, i32 0))
+ br label %cond.end35
+
+cond.end35: ; preds = %cond.false34, %cond.true33
+ %104 = bitcast %"struct.std::__1::atomic"* %obj to %"struct.std::__1::__atomic_base.0"*
+ store %"struct.std::__1::__atomic_base.0"* %104, %"struct.std::__1::__atomic_base.0"** %this.addr.i43, align 4
+ %this1.i44 = load %"struct.std::__1::__atomic_base.0"** %this.addr.i43
+ store %"struct.std::__1::__atomic_base.0"* %this1.i44, %"struct.std::__1::__atomic_base.0"** %this.addr.i.i42, align 4
+ store i32 5, i32* %__m.addr.i.i, align 4
+ %this1.i.i45 = load %"struct.std::__1::__atomic_base.0"** %this.addr.i.i42
+ %__a_.i.i = getelementptr inbounds %"struct.std::__1::__atomic_base.0"* %this1.i.i45, i32 0, i32 0
+ %105 = load i32* %__m.addr.i.i, align 4
+ switch i32 %105, label %monotonic.i.i [
+ i32 1, label %acquire.i.i
+ i32 2, label %acquire.i.i
+ i32 5, label %seqcst.i.i
+ ]
+
+monotonic.i.i: ; preds = %cond.end35
+ %106 = load atomic volatile i8* %__a_.i.i monotonic, align 1
+ store i8 %106, i8* %.atomicdst.i.i, align 1
+ br label %_ZNVKSt3__113__atomic_baseIcLb0EEcvcEv.exit
+
+acquire.i.i: ; preds = %cond.end35, %cond.end35
+ %107 = load atomic volatile i8* %__a_.i.i acquire, align 1
+ store i8 %107, i8* %.atomicdst.i.i, align 1
+ br label %_ZNVKSt3__113__atomic_baseIcLb0EEcvcEv.exit
+
+seqcst.i.i: ; preds = %cond.end35
+ %108 = load atomic volatile i8* %__a_.i.i seq_cst, align 1
+ store i8 %108, i8* %.atomicdst.i.i, align 1
+ br label %_ZNVKSt3__113__atomic_baseIcLb0EEcvcEv.exit
+
+_ZNVKSt3__113__atomic_baseIcLb0EEcvcEv.exit: ; preds = %seqcst.i.i, %acquire.i.i, %monotonic.i.i
+ %109 = load i8* %.atomicdst.i.i
+ %conv37 = sext i8 %109 to i32
+ %cmp38 = icmp eq i32 %conv37, 1
+ br i1 %cmp38, label %cond.true39, label %cond.false40
+
+cond.true39: ; preds = %_ZNVKSt3__113__atomic_baseIcLb0EEcvcEv.exit
+ br label %cond.end41
+
+cond.false40: ; preds = %_ZNVKSt3__113__atomic_baseIcLb0EEcvcEv.exit
+ call void @__assert_func(i8* getelementptr inbounds ([8 x i8]* @.str, i32 0, i32 0), i32 29, i8* getelementptr inbounds ([63 x i8]* @__PRETTY_FUNCTION__._Z7do_testIVNSt3__16atomicIcEEcEvv, i32 0, i32 0), i8* getelementptr inbounds ([12 x i8]* @.str7, i32 0, i32 0))
+ br label %cond.end41
+
+cond.end41: ; preds = %cond.false40, %cond.true39
+ ret void
+}
+
+declare void @__assert_func(i8*, i32, i8*, i8*)
+declare i32 @printf(i8*, ...)
+
diff --git a/tests/cases/inttoptrfloat.ll b/tests/cases/inttoptrfloat.ll
new file mode 100644
index 00000000..607539fe
--- /dev/null
+++ b/tests/cases/inttoptrfloat.ll
@@ -0,0 +1,19 @@
+; ModuleID = 'tests/hello_world.bc'
+target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32-S128"
+target triple = "i386-pc-linux-gnu"
+
+@.str = private unnamed_addr constant [15 x i8] c"hello, world!\0A\00", align 1 ; [#uses=1 type=[15 x i8]*]
+
+; [#uses=0]
+define i32 @main() {
+entry:
+ %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([15 x i8]* @.str, i32 0, i32 0), float %b) ; [#uses=0 type=i32]
+ %ff = alloca float, align 4
+ %a = load float* inttoptr (i32 4 to float*), align 4
+ store float %a, float* %ff, align 4
+ %b = load float* %ff, align 4
+ ret i32 1
+}
+
+; [#uses=1]
+declare i32 @printf(i8*, ...)
diff --git a/tests/cases/udiv.ll b/tests/cases/udiv.ll
new file mode 100644
index 00000000..a809db5a
--- /dev/null
+++ b/tests/cases/udiv.ll
@@ -0,0 +1,19 @@
+; ModuleID = 'tests/hello_world.bc'
+target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32-S128"
+target triple = "i386-pc-linux-gnu"
+
+@.str = private unnamed_addr constant [15 x i8] c"hello, world!\0A\00", align 1 ; [#uses=1 type=[15 x i8]*]
+
+; [#uses=0]
+define i32 @main() {
+entry:
+ %retval = alloca i32, align 4 ; [#uses=1 type=i32*]
+ %waka = udiv i32 -1806866064, 5
+ %waka2 = add i32 2247483648, 2247483648
+ store i32 0, i32* %retval
+ %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([15 x i8]* @.str, i32 0, i32 0), i32 %waka, i32 %waka2) ; [#uses=0 type=i32]
+ ret i32 1
+}
+
+; [#uses=1]
+declare i32 @printf(i8*, ...)
diff --git a/tests/cubegeom.c b/tests/cubegeom.c
index c137ad80..787b8373 100644
--- a/tests/cubegeom.c
+++ b/tests/cubegeom.c
@@ -45,6 +45,8 @@ void verify() {
int main(int argc, char *argv[])
{
+ int temp; // testing
+
SDL_Surface *screen;
if ( SDL_Init(SDL_INIT_VIDEO) != 0 ) {
printf("Unable to initialize SDL: %s\n", SDL_GetError());
@@ -124,7 +126,9 @@ int main(int argc, char *argv[])
glActiveTexture(GL_TEXTURE0);
+ glGetBooleanv(GL_VERTEX_ARRAY, &temp); assert(!temp);
glEnableClientState(GL_VERTEX_ARRAY);
+ glGetBooleanv(GL_VERTEX_ARRAY, &temp); assert(temp);
GLuint arrayBuffer, elementBuffer;
glGenBuffers(1, &arrayBuffer);
@@ -207,6 +211,20 @@ int main(int argc, char *argv[])
glNormalPointer(GL_BYTE, 32, (void*)12);
glColorPointer(4, GL_UNSIGNED_BYTE, 32, (void*)28);
+ glGetPointerv(GL_VERTEX_ARRAY_POINTER, &temp); assert(temp == 0);
+ glGetPointerv(GL_COLOR_ARRAY_POINTER, &temp); assert(temp == 28);
+ glGetPointerv(GL_TEXTURE_COORD_ARRAY_POINTER, &temp); assert(temp == 16);
+ glGetIntegerv(GL_VERTEX_ARRAY_SIZE, &temp); assert(temp == 3);
+ glGetIntegerv(GL_VERTEX_ARRAY_TYPE, &temp); assert(temp == GL_FLOAT);
+ glGetIntegerv(GL_VERTEX_ARRAY_STRIDE, &temp); assert(temp == 32);
+ glGetIntegerv(GL_COLOR_ARRAY_SIZE, &temp); assert(temp == 4);
+ glGetIntegerv(GL_COLOR_ARRAY_TYPE, &temp); assert(temp == GL_UNSIGNED_BYTE);
+ glGetIntegerv(GL_COLOR_ARRAY_STRIDE, &temp); assert(temp == 32);
+ glGetIntegerv(GL_TEXTURE_COORD_ARRAY_SIZE, &temp); assert(temp == 2);
+ glGetIntegerv(GL_TEXTURE_COORD_ARRAY_TYPE, &temp); assert(temp == GL_FLOAT);
+ glGetIntegerv(GL_TEXTURE_COORD_ARRAY_STRIDE, &temp); assert(temp == 32);
+ glGetBooleanv(GL_VERTEX_ARRAY, &temp); assert(temp);
+
glBindTexture(GL_TEXTURE_2D, texture); // diffuse?
glActiveTexture(GL_TEXTURE0);
glActiveTexture(GL_TEXTURE1);
diff --git a/tests/cubegeom_pre2_vao.c b/tests/cubegeom_pre2_vao.c
new file mode 100644
index 00000000..98bedd54
--- /dev/null
+++ b/tests/cubegeom_pre2_vao.c
@@ -0,0 +1,380 @@
+/*
+THIS WORK, INCLUDING THE SOURCE CODE, DOCUMENTATION
+AND RELATED MEDIA AND DATA, IS PLACED INTO THE PUBLIC DOMAIN.
+
+THE ORIGINAL AUTHOR IS KYLE FOLEY.
+
+THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY
+OF ANY KIND, NOT EVEN THE IMPLIED WARRANTY OF
+MERCHANTABILITY. THE AUTHOR OF THIS SOFTWARE,
+ASSUMES _NO_ RESPONSIBILITY FOR ANY CONSEQUENCE
+RESULTING FROM THE USE, MODIFICATION, OR
+REDISTRIBUTION OF THIS SOFTWARE.
+*/
+
+#if !EMSCRIPTEN
+#define USE_GLEW 1
+#endif
+
+#if USE_GLEW
+#include "GL/glew.h"
+#endif
+
+#include "SDL/SDL.h"
+#if !USE_GLEW
+#include "SDL/SDL_opengl.h"
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+PFNGLGENVERTEXARRAYSPROC glGenVertexArrays_ = NULL;
+PFNGLBINDVERTEXARRAYPROC glBindVertexArray_ = NULL;
+PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays_ = NULL;
+
+void verify() {
+ int width = 640, height = 480;
+ unsigned char *data = (unsigned char*)malloc(width*height*4);
+ glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, data);
+ int sum = 0;
+ for (int x = 0; x < width*height*4; x++) {
+ if (x % 4 != 3) sum += x * data[x];
+ }
+#if EMSCRIPTEN
+ int result = sum;
+ REPORT_RESULT();
+#endif
+}
+
+int main(int argc, char *argv[])
+{
+ SDL_Surface *screen;
+ if ( SDL_Init(SDL_INIT_VIDEO) != 0 ) {
+ printf("Unable to initialize SDL: %s\n", SDL_GetError());
+ return 1;
+ }
+
+ SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
+ screen = SDL_SetVideoMode( 640, 480, 24, SDL_OPENGL );
+ if ( !screen ) {
+ printf("Unable to set video mode: %s\n", SDL_GetError());
+ return 1;
+ }
+
+ glClearColor( 0, 0, 0, 0 );
+ glClear( GL_COLOR_BUFFER_BIT );
+
+ glGenVertexArrays_ = (PFNGLGENVERTEXARRAYSPROC) SDL_GL_GetProcAddress("glGenVertexArrays");
+ assert(glGenVertexArrays_);
+ glBindVertexArray_ = (PFNGLBINDVERTEXARRAYPROC) SDL_GL_GetProcAddress("glBindVertexArray");
+ assert(glBindVertexArray_);
+ glDeleteVertexArrays_ = (PFNGLDELETEVERTEXARRAYSPROC) SDL_GL_GetProcAddress("glDeleteVertexArrays");
+ assert(glDeleteVertexArrays_);
+
+ // Generate a VAO
+ GLuint vao;
+ glGenVertexArrays_(1, &vao);
+ glBindVertexArray_(vao);
+
+ // Create a texture
+
+ GLuint texture;
+ glGenTextures( 1, &texture );
+ glBindTexture( GL_TEXTURE_2D, texture );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
+ GLubyte textureData[16*16*4];
+ for (int x = 0; x < 16; x++) {
+ for (int y = 0; y < 16; y++) {
+ *((int*)&textureData[(x*16 + y) * 4]) = x*16 + ((y*16) << 8);
+ }
+ }
+ glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, textureData );
+
+ // Create a second texture
+
+ GLuint texture2;
+ glGenTextures( 1, &texture2 );
+ glBindTexture( GL_TEXTURE_2D, texture2 );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
+ GLubyte texture2Data[] = { 0xff, 0, 0, 0xff,
+ 0, 0xff, 0, 0xaa,
+ 0, 0, 0xff, 0x55,
+ 0x80, 0x90, 0x70, 0 };
+ glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, texture2Data );
+
+ // BEGIN
+
+#if USE_GLEW
+ glewInit();
+#endif
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ // original: glFrustum(-0.6435469817188064, 0.6435469817188064 ,-0.48266022190470925, 0.48266022190470925 ,0.5400000214576721, 2048);
+ //glFrustum(-0.6435469817188064, 0.1435469817188064 ,-0.48266022190470925, 0.88266022190470925 ,0.5400000214576721, 2048);
+ GLfloat pm[] = { 1.372136116027832, 0, 0, 0, 0, 0.7910231351852417, 0, 0, -0.6352481842041016, 0.29297152161598206, -1.0005275011062622, -1, 0, 0, -1.080284833908081, 0 };
+ glLoadMatrixf(pm);
+
+ glMatrixMode(GL_MODELVIEW);
+ GLfloat matrixData[] = { -1, 0, 0, 0,
+ 0, 0,-1, 0,
+ 0, 1, 0, 0,
+ 0, 0, 0, 1 };
+ glLoadMatrixf(matrixData);
+ //glTranslated(-512,-512,-527); // XXX this should be uncommented, but if it is then nothing is shown
+
+// glEnable(GL_CULL_FACE);
+ // glEnable(GL_DEPTH_TEST);
+
+ //glClear(GL_DEPTH_BUFFER_BIT);
+
+// glEnableClientState(GL_NORMAL_ARRAY);
+ // glEnableClientState(GL_COLOR_ARRAY);
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+
+ glActiveTexture(GL_TEXTURE0);
+
+ glEnableClientState(GL_VERTEX_ARRAY);
+
+ GLuint arrayBuffer, elementBuffer;
+ glGenBuffers(1, &arrayBuffer);
+ glGenBuffers(1, &elementBuffer);
+
+ GLubyte arrayData[] = {
+/*
+[0, 0, 0, 67] ==> 128 float
+[0, 0, 128, 67] ==> 256 float
+[0, 0, 0, 68] ==> 512 float
+[0, 0, 128, 68] ==> 1024 float
+
+[vertex x ] [vertex y ] [vertex z ] [nr] [texture u ] [texture v ] [lm u ] [lm v ] [color r,g,b,a ] */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128, // 0
+ 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128, // 1
+ 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 2
+ 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 3
+ 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128, // 4
+ 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 128, 67, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128, // 5
+ 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 128, 67, 0, 0, 0, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 6
+ 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 7
+ 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 8
+ 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 9
+ 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 128, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 10
+ 0, 0, 0, 0, 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 11
+ 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 12
+ 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 128, 67, 0, 0, 0, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 13
+ 0, 0, 128, 68, 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 128, 67, 0, 0, 128, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 14
+ 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 128, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 15
+
+ 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 0, 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 128, 68, 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128
+ };
+ assert(sizeof(arrayData) == 1408);
+ glBindBuffer(GL_ARRAY_BUFFER, arrayBuffer);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(arrayData), arrayData, GL_STATIC_DRAW);
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
+
+ GLushort elementData[] = { 1, 2, 0, 2, 3, 0, 5, 6, 4, 6, 7, 4, 9, 10, 8, 10, 11, 8, 13, 14, 12, 14, 15, 12 };
+ assert(sizeof(elementData) == 48);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementBuffer);
+ glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(elementData), elementData, GL_STATIC_DRAW);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+
+ glBindBuffer(GL_ARRAY_BUFFER, arrayBuffer);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementBuffer);
+
+ // sauer vertex data is apparently 0-12: V3F, 12: N1B, 16-24: T2F, 24-28: T2S, 28-32: C4B
+ glVertexPointer(3, GL_FLOAT, 32, (void*)0); // all these apply to the ARRAY_BUFFER that is bound
+ glTexCoordPointer(2, GL_FLOAT, 32, (void*)16);
+// glClientActiveTexture(GL_TEXTURE1); // XXX seems to be ignored in native build
+// glTexCoordPointer(2, GL_SHORT, 32, (void*)24);
+// glClientActiveTexture(GL_TEXTURE0); // likely not needed, it is a cleanup
+// glNormalPointer(GL_BYTE, 32, (void*)12);
+// glColorPointer(4, GL_UNSIGNED_BYTE, 32, (void*)28);
+
+ glBindTexture(GL_TEXTURE_2D, texture); // diffuse?
+ glActiveTexture(GL_TEXTURE0);
+ glActiveTexture(GL_TEXTURE1);
+ glBindTexture(GL_TEXTURE_2D, texture2); // lightmap?
+ glActiveTexture(GL_TEXTURE0);
+
+ GLint ok;
+
+ const char *vertexShader = "uniform mat4 u_modelView;\n"
+ "uniform mat4 u_projection;\n"
+ "varying vec4 v_texCoord0;\n"
+ "void main(void)\n"
+ "{\n" // (gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex)
+ // (u_projection * u_modelView * a_position)
+ " gl_Position = (u_projection * u_modelView * gl_Vertex) + vec4(200, 0, 0, 0);\n"
+ " v_texCoord0.xy = gl_MultiTexCoord0.xy/20.0;\n" // added /100 here
+ "}\n";
+ const char *fragmentShader = "uniform sampler2D diffusemap;\n"
+ "varying vec4 v_texCoord0;\n"
+ "void main(void)\n"
+ "{\n"
+ " vec4 diffuse = texture2D(diffusemap, v_texCoord0.xy);\n"
+ " gl_FragColor = diffuse;\n"
+ "}\n";
+
+ GLuint vs = glCreateShader(GL_VERTEX_SHADER);
+ glShaderSource(vs, 1, &vertexShader, NULL);
+ glCompileShader(vs);
+ glGetShaderiv(vs, GL_COMPILE_STATUS, &ok);
+ if (!ok) {
+ printf("Shader compilation error with vertex\n");
+ GLint infoLen = 0;
+ glGetShaderiv (vs, GL_INFO_LOG_LENGTH, &infoLen);
+ if (infoLen > 1)
+ {
+ char* infoLog = (char *)malloc(sizeof(char) * infoLen+1);
+ glGetShaderInfoLog(vs, infoLen, NULL, infoLog);
+ printf("Error compiling shader:\n%s\n", infoLog);
+ }
+ }
+
+ GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
+ glShaderSource(fs, 1, &fragmentShader, NULL);
+ glCompileShader(fs);
+ glGetShaderiv(fs, GL_COMPILE_STATUS, &ok);
+ if (!ok) {
+ printf("Shader compilation error with fragment\n");
+ GLint infoLen = 0;
+ glGetShaderiv (vs, GL_INFO_LOG_LENGTH, &infoLen);
+ if (infoLen > 1)
+ {
+ char* infoLog = (char *)malloc(sizeof(char) * infoLen+1);
+ glGetShaderInfoLog(vs, infoLen, NULL, infoLog);
+ printf("Error compiling shader:\n%s\n", infoLog);
+ }
+ }
+
+ GLuint program = glCreateProgram();
+
+ glAttachShader(program, vs);
+ glAttachShader(program, fs);
+ glLinkProgram(program);
+ glGetProgramiv(program, GL_LINK_STATUS, &ok);
+ assert(ok);
+
+ glUseProgram(program);
+
+ //GLint lightmapLocation = glGetUniformLocation(program, "lightmap");
+ //assert(lightmapLocation >= 0);
+ //glUniform1i(lightmapLocation, 1); // sampler2D? Is it the texture unit?
+
+ GLint diffusemapLocation = glGetUniformLocation(program, "diffusemap");
+ assert(diffusemapLocation >= 0);
+ glUniform1i(diffusemapLocation, 0);
+
+ //GLint texgenscrollLocation = glGetUniformLocation(program, "texgenscroll");
+ //assert(texgenscrollLocation >= 0);
+
+ //GLint colorparamsLocation = glGetUniformLocation(program, "colorparams");
+ //assert(colorparamsLocation >= 0);
+
+ //GLfloat texgenscrollData[] = { 0, 0, 0, 0 };
+ //glUniform4fv(texgenscrollLocation, 1, texgenscrollData);
+
+ //GLfloat colorparamsData[] = { 2, 2, 2, 1 };
+ //glUniform4fv(colorparamsLocation, 1, colorparamsData);
+
+ {
+ GLfloat data[16];
+ glGetFloatv(GL_MODELVIEW_MATRIX, data);
+ printf("Modelview: ");
+ for (int i = 0; i < 16; i++) printf("%.3f, ", data[i]);
+ printf("\n");
+ //memset(data, 0, 16*4);
+ GLint modelViewLocation = glGetUniformLocation(program, "u_modelView");
+ assert(modelViewLocation >= 0);
+ glUniformMatrix4fv(modelViewLocation, 1, GL_FALSE, data);
+ }
+ {
+ GLfloat data[16];
+ glGetFloatv(GL_PROJECTION_MATRIX, data);
+ printf("Projection: ");
+ for (int i = 0; i < 16; i++) printf("%.3f, ", data[i]);
+ printf("\n");
+ //memset(data, 0, 16*4);
+ GLint projectionLocation = glGetUniformLocation(program, "u_projection");
+ assert(projectionLocation >= 0);
+ glUniformMatrix4fv(projectionLocation, 1, GL_FALSE, data);
+ }
+
+/*
+ glBindAttribLocation(program, 0, "a_position");
+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 32, (void*)0);
+ glEnableVertexAttribArray(0);
+
+ glBindAttribLocation(program, 1, "v_texCoord0");
+ glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 32, (void*)16);
+ glEnableVertexAttribArray(1);
+*/
+
+ // stop recording in the VAO
+
+ glBindVertexArray_(0);
+
+ // unbind all the stuff the VAO would save for us, so this is a valid test
+
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+
+ glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+ glDisableClientState(GL_VERTEX_ARRAY);
+
+ // draw with VAO
+
+ glBindVertexArray_(vao);
+
+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, (void*)12);
+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, (void*) 0);
+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, (void*)24);
+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, (void*)36);
+
+ // END
+
+ SDL_GL_SwapBuffers();
+
+ verify();
+
+#if !EMSCRIPTEN
+ SDL_Delay(1500);
+#endif
+
+ // SDL_Quit();
+
+ return 0;
+}
+
diff --git a/tests/cubegeom_pre2_vao2.c b/tests/cubegeom_pre2_vao2.c
new file mode 100644
index 00000000..e3ab4d62
--- /dev/null
+++ b/tests/cubegeom_pre2_vao2.c
@@ -0,0 +1,381 @@
+/*
+THIS WORK, INCLUDING THE SOURCE CODE, DOCUMENTATION
+AND RELATED MEDIA AND DATA, IS PLACED INTO THE PUBLIC DOMAIN.
+
+THE ORIGINAL AUTHOR IS KYLE FOLEY.
+
+THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY
+OF ANY KIND, NOT EVEN THE IMPLIED WARRANTY OF
+MERCHANTABILITY. THE AUTHOR OF THIS SOFTWARE,
+ASSUMES _NO_ RESPONSIBILITY FOR ANY CONSEQUENCE
+RESULTING FROM THE USE, MODIFICATION, OR
+REDISTRIBUTION OF THIS SOFTWARE.
+*/
+
+#if !EMSCRIPTEN
+#define USE_GLEW 1
+#endif
+
+#if USE_GLEW
+#include "GL/glew.h"
+#endif
+
+#include "SDL/SDL.h"
+#if !USE_GLEW
+#include "SDL/SDL_opengl.h"
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+PFNGLGENVERTEXARRAYSPROC glGenVertexArrays_ = NULL;
+PFNGLBINDVERTEXARRAYPROC glBindVertexArray_ = NULL;
+PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays_ = NULL;
+
+void verify() {
+ int width = 640, height = 480;
+ unsigned char *data = (unsigned char*)malloc(width*height*4);
+ glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, data);
+ int sum = 0;
+ for (int x = 0; x < width*height*4; x++) {
+ if (x % 4 != 3) sum += x * data[x];
+ }
+#if EMSCRIPTEN
+ int result = sum;
+ REPORT_RESULT();
+#endif
+}
+
+int main(int argc, char *argv[])
+{
+ SDL_Surface *screen;
+ if ( SDL_Init(SDL_INIT_VIDEO) != 0 ) {
+ printf("Unable to initialize SDL: %s\n", SDL_GetError());
+ return 1;
+ }
+
+ SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
+ screen = SDL_SetVideoMode( 640, 480, 24, SDL_OPENGL );
+ if ( !screen ) {
+ printf("Unable to set video mode: %s\n", SDL_GetError());
+ return 1;
+ }
+
+ glClearColor( 0, 0, 0, 0 );
+ glClear( GL_COLOR_BUFFER_BIT );
+
+ glGenVertexArrays_ = (PFNGLGENVERTEXARRAYSPROC) SDL_GL_GetProcAddress("glGenVertexArrays");
+ assert(glGenVertexArrays_);
+ glBindVertexArray_ = (PFNGLBINDVERTEXARRAYPROC) SDL_GL_GetProcAddress("glBindVertexArray");
+ assert(glBindVertexArray_);
+ glDeleteVertexArrays_ = (PFNGLDELETEVERTEXARRAYSPROC) SDL_GL_GetProcAddress("glDeleteVertexArrays");
+ assert(glDeleteVertexArrays_);
+
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY); // enabling it *before* the vao does nothing, the vao should wipe it out!
+
+ // Generate a VAO
+ GLuint vao;
+ glGenVertexArrays_(1, &vao);
+ glBindVertexArray_(vao);
+
+ // Create a texture
+
+ GLuint texture;
+ glGenTextures( 1, &texture );
+ glBindTexture( GL_TEXTURE_2D, texture );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
+ GLubyte textureData[16*16*4];
+ for (int x = 0; x < 16; x++) {
+ for (int y = 0; y < 16; y++) {
+ *((int*)&textureData[(x*16 + y) * 4]) = x*16 + ((y*16) << 8);
+ }
+ }
+ glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, textureData );
+
+ // Create a second texture
+
+ GLuint texture2;
+ glGenTextures( 1, &texture2 );
+ glBindTexture( GL_TEXTURE_2D, texture2 );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
+ GLubyte texture2Data[] = { 0xff, 0, 0, 0xff,
+ 0, 0xff, 0, 0xaa,
+ 0, 0, 0xff, 0x55,
+ 0x80, 0x90, 0x70, 0 };
+ glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, texture2Data );
+
+ // BEGIN
+
+#if USE_GLEW
+ glewInit();
+#endif
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ // original: glFrustum(-0.6435469817188064, 0.6435469817188064 ,-0.48266022190470925, 0.48266022190470925 ,0.5400000214576721, 2048);
+ //glFrustum(-0.6435469817188064, 0.1435469817188064 ,-0.48266022190470925, 0.88266022190470925 ,0.5400000214576721, 2048);
+ GLfloat pm[] = { 1.372136116027832, 0, 0, 0, 0, 0.7910231351852417, 0, 0, -0.6352481842041016, 0.29297152161598206, -1.0005275011062622, -1, 0, 0, -1.080284833908081, 0 };
+ glLoadMatrixf(pm);
+
+ glMatrixMode(GL_MODELVIEW);
+ GLfloat matrixData[] = { -1, 0, 0, 0,
+ 0, 0,-1, 0,
+ 0, 1, 0, 0,
+ 0, 0, 0, 1 };
+ glLoadMatrixf(matrixData);
+ //glTranslated(-512,-512,-527); // XXX this should be uncommented, but if it is then nothing is shown
+
+// glEnable(GL_CULL_FACE);
+ // glEnable(GL_DEPTH_TEST);
+
+ //glClear(GL_DEPTH_BUFFER_BIT);
+
+// glEnableClientState(GL_NORMAL_ARRAY);
+ // glEnableClientState(GL_COLOR_ARRAY);
+
+ glActiveTexture(GL_TEXTURE0);
+
+ glEnableClientState(GL_VERTEX_ARRAY);
+
+ GLuint arrayBuffer, elementBuffer;
+ glGenBuffers(1, &arrayBuffer);
+ glGenBuffers(1, &elementBuffer);
+
+ GLubyte arrayData[] = {
+/*
+[0, 0, 0, 67] ==> 128 float
+[0, 0, 128, 67] ==> 256 float
+[0, 0, 0, 68] ==> 512 float
+[0, 0, 128, 68] ==> 1024 float
+
+[vertex x ] [vertex y ] [vertex z ] [nr] [texture u ] [texture v ] [lm u ] [lm v ] [color r,g,b,a ] */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128, // 0
+ 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128, // 1
+ 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 2
+ 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 3
+ 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128, // 4
+ 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 128, 67, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128, // 5
+ 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 128, 67, 0, 0, 0, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 6
+ 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 7
+ 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 8
+ 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 9
+ 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 128, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 10
+ 0, 0, 0, 0, 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 11
+ 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 12
+ 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 128, 67, 0, 0, 0, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 13
+ 0, 0, 128, 68, 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 128, 67, 0, 0, 128, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 14
+ 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 128, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 15
+
+ 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 0, 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 128, 68, 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128
+ };
+ assert(sizeof(arrayData) == 1408);
+ glBindBuffer(GL_ARRAY_BUFFER, arrayBuffer);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(arrayData), arrayData, GL_STATIC_DRAW);
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
+
+ GLushort elementData[] = { 1, 2, 0, 2, 3, 0, 5, 6, 4, 6, 7, 4, 9, 10, 8, 10, 11, 8, 13, 14, 12, 14, 15, 12 };
+ assert(sizeof(elementData) == 48);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementBuffer);
+ glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(elementData), elementData, GL_STATIC_DRAW);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+
+ glBindBuffer(GL_ARRAY_BUFFER, arrayBuffer);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementBuffer);
+
+ // sauer vertex data is apparently 0-12: V3F, 12: N1B, 16-24: T2F, 24-28: T2S, 28-32: C4B
+ glVertexPointer(3, GL_FLOAT, 32, (void*)0); // all these apply to the ARRAY_BUFFER that is bound
+ glTexCoordPointer(2, GL_FLOAT, 32, (void*)16);
+// glClientActiveTexture(GL_TEXTURE1); // XXX seems to be ignored in native build
+// glTexCoordPointer(2, GL_SHORT, 32, (void*)24);
+// glClientActiveTexture(GL_TEXTURE0); // likely not needed, it is a cleanup
+// glNormalPointer(GL_BYTE, 32, (void*)12);
+// glColorPointer(4, GL_UNSIGNED_BYTE, 32, (void*)28);
+
+ glBindTexture(GL_TEXTURE_2D, texture); // diffuse?
+ glActiveTexture(GL_TEXTURE0);
+ glActiveTexture(GL_TEXTURE1);
+ glBindTexture(GL_TEXTURE_2D, texture2); // lightmap?
+ glActiveTexture(GL_TEXTURE0);
+
+ GLint ok;
+
+ const char *vertexShader = "uniform mat4 u_modelView;\n"
+ "uniform mat4 u_projection;\n"
+ "varying vec4 v_texCoord0;\n"
+ "void main(void)\n"
+ "{\n" // (gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex)
+ // (u_projection * u_modelView * a_position)
+ " gl_Position = (u_projection * u_modelView * gl_Vertex) + vec4(200, 0, 0, 0);\n"
+ " v_texCoord0.xy = gl_MultiTexCoord0.xy/20.0;\n" // added /100 here
+ "}\n";
+ const char *fragmentShader = "uniform sampler2D diffusemap;\n"
+ "varying vec4 v_texCoord0;\n"
+ "void main(void)\n"
+ "{\n"
+ " vec4 diffuse = texture2D(diffusemap, v_texCoord0.xy);\n"
+ " gl_FragColor = diffuse;\n"
+ "}\n";
+
+ GLuint vs = glCreateShader(GL_VERTEX_SHADER);
+ glShaderSource(vs, 1, &vertexShader, NULL);
+ glCompileShader(vs);
+ glGetShaderiv(vs, GL_COMPILE_STATUS, &ok);
+ if (!ok) {
+ printf("Shader compilation error with vertex\n");
+ GLint infoLen = 0;
+ glGetShaderiv (vs, GL_INFO_LOG_LENGTH, &infoLen);
+ if (infoLen > 1)
+ {
+ char* infoLog = (char *)malloc(sizeof(char) * infoLen+1);
+ glGetShaderInfoLog(vs, infoLen, NULL, infoLog);
+ printf("Error compiling shader:\n%s\n", infoLog);
+ }
+ }
+
+ GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
+ glShaderSource(fs, 1, &fragmentShader, NULL);
+ glCompileShader(fs);
+ glGetShaderiv(fs, GL_COMPILE_STATUS, &ok);
+ if (!ok) {
+ printf("Shader compilation error with fragment\n");
+ GLint infoLen = 0;
+ glGetShaderiv (vs, GL_INFO_LOG_LENGTH, &infoLen);
+ if (infoLen > 1)
+ {
+ char* infoLog = (char *)malloc(sizeof(char) * infoLen+1);
+ glGetShaderInfoLog(vs, infoLen, NULL, infoLog);
+ printf("Error compiling shader:\n%s\n", infoLog);
+ }
+ }
+
+ GLuint program = glCreateProgram();
+
+ glAttachShader(program, vs);
+ glAttachShader(program, fs);
+ glLinkProgram(program);
+ glGetProgramiv(program, GL_LINK_STATUS, &ok);
+ assert(ok);
+
+ glUseProgram(program);
+
+ //GLint lightmapLocation = glGetUniformLocation(program, "lightmap");
+ //assert(lightmapLocation >= 0);
+ //glUniform1i(lightmapLocation, 1); // sampler2D? Is it the texture unit?
+
+ GLint diffusemapLocation = glGetUniformLocation(program, "diffusemap");
+ assert(diffusemapLocation >= 0);
+ glUniform1i(diffusemapLocation, 0);
+
+ //GLint texgenscrollLocation = glGetUniformLocation(program, "texgenscroll");
+ //assert(texgenscrollLocation >= 0);
+
+ //GLint colorparamsLocation = glGetUniformLocation(program, "colorparams");
+ //assert(colorparamsLocation >= 0);
+
+ //GLfloat texgenscrollData[] = { 0, 0, 0, 0 };
+ //glUniform4fv(texgenscrollLocation, 1, texgenscrollData);
+
+ //GLfloat colorparamsData[] = { 2, 2, 2, 1 };
+ //glUniform4fv(colorparamsLocation, 1, colorparamsData);
+
+ {
+ GLfloat data[16];
+ glGetFloatv(GL_MODELVIEW_MATRIX, data);
+ printf("Modelview: ");
+ for (int i = 0; i < 16; i++) printf("%.3f, ", data[i]);
+ printf("\n");
+ //memset(data, 0, 16*4);
+ GLint modelViewLocation = glGetUniformLocation(program, "u_modelView");
+ assert(modelViewLocation >= 0);
+ glUniformMatrix4fv(modelViewLocation, 1, GL_FALSE, data);
+ }
+ {
+ GLfloat data[16];
+ glGetFloatv(GL_PROJECTION_MATRIX, data);
+ printf("Projection: ");
+ for (int i = 0; i < 16; i++) printf("%.3f, ", data[i]);
+ printf("\n");
+ //memset(data, 0, 16*4);
+ GLint projectionLocation = glGetUniformLocation(program, "u_projection");
+ assert(projectionLocation >= 0);
+ glUniformMatrix4fv(projectionLocation, 1, GL_FALSE, data);
+ }
+
+/*
+ glBindAttribLocation(program, 0, "a_position");
+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 32, (void*)0);
+ glEnableVertexAttribArray(0);
+
+ glBindAttribLocation(program, 1, "v_texCoord0");
+ glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 32, (void*)16);
+ glEnableVertexAttribArray(1);
+*/
+
+ // stop recording in the VAO
+
+ glBindVertexArray_(0);
+
+ // unbind all the stuff the VAO would save for us, so this is a valid test
+
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+
+ glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+ glDisableClientState(GL_VERTEX_ARRAY);
+
+ // draw with VAO
+
+ glBindVertexArray_(vao);
+
+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, (void*)12);
+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, (void*) 0);
+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, (void*)24);
+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, (void*)36);
+
+ // END
+
+ SDL_GL_SwapBuffers();
+
+ verify();
+
+#if !EMSCRIPTEN
+ SDL_Delay(1500);
+#endif
+
+ // SDL_Quit();
+
+ return 0;
+}
+
diff --git a/tests/cubegeom_pre_vao.c b/tests/cubegeom_pre_vao.c
new file mode 100644
index 00000000..f1d35fb5
--- /dev/null
+++ b/tests/cubegeom_pre_vao.c
@@ -0,0 +1,333 @@
+/*
+THIS WORK, INCLUDING THE SOURCE CODE, DOCUMENTATION
+AND RELATED MEDIA AND DATA, IS PLACED INTO THE PUBLIC DOMAIN.
+
+THE ORIGINAL AUTHOR IS KYLE FOLEY.
+
+THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY
+OF ANY KIND, NOT EVEN THE IMPLIED WARRANTY OF
+MERCHANTABILITY. THE AUTHOR OF THIS SOFTWARE,
+ASSUMES _NO_ RESPONSIBILITY FOR ANY CONSEQUENCE
+RESULTING FROM THE USE, MODIFICATION, OR
+REDISTRIBUTION OF THIS SOFTWARE.
+*/
+
+#if !EMSCRIPTEN
+#define USE_GLEW 1
+#endif
+
+#if USE_GLEW
+#include "GL/glew.h"
+#endif
+
+#include "SDL/SDL.h"
+#if !USE_GLEW
+#include "SDL/SDL_opengl.h"
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+void verify() {
+ int width = 640, height = 480;
+ unsigned char *data = (unsigned char*)malloc(width*height*4);
+ glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, data);
+ int sum = 0;
+ for (int x = 0; x < width*height*4; x++) {
+ if (x % 4 != 3) sum += x * data[x];
+ }
+#if EMSCRIPTEN
+ int result = sum;
+ REPORT_RESULT();
+#endif
+}
+
+int main(int argc, char *argv[])
+{
+ SDL_Surface *screen;
+ if ( SDL_Init(SDL_INIT_VIDEO) != 0 ) {
+ printf("Unable to initialize SDL: %s\n", SDL_GetError());
+ return 1;
+ }
+
+ SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
+ screen = SDL_SetVideoMode( 640, 480, 24, SDL_OPENGL );
+ if ( !screen ) {
+ printf("Unable to set video mode: %s\n", SDL_GetError());
+ return 1;
+ }
+
+ glClearColor( 0, 0, 0, 0 );
+ glClear( GL_COLOR_BUFFER_BIT );
+
+ // Create a texture
+
+ GLuint texture;
+ glGenTextures( 1, &texture );
+ glBindTexture( GL_TEXTURE_2D, texture );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
+ GLubyte textureData[16*16*4];
+ for (int x = 0; x < 16; x++) {
+ for (int y = 0; y < 16; y++) {
+ *((int*)&textureData[(x*16 + y) * 4]) = x*16 + ((y*16) << 8);
+ }
+ }
+ glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, textureData );
+
+ // Create a second texture
+
+ GLuint texture2;
+ glGenTextures( 1, &texture2 );
+ glBindTexture( GL_TEXTURE_2D, texture2 );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
+ GLubyte texture2Data[] = { 0xff, 0, 0, 0xff,
+ 0, 0xff, 0, 0xaa,
+ 0, 0, 0xff, 0x55,
+ 0x80, 0x90, 0x70, 0 };
+ glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, texture2Data );
+
+ // BEGIN
+
+#if USE_GLEW
+ glewInit();
+#endif
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ // original: glFrustum(-0.6435469817188064, 0.6435469817188064 ,-0.48266022190470925, 0.48266022190470925 ,0.5400000214576721, 2048);
+ //glFrustum(-0.6435469817188064, 0.1435469817188064 ,-0.48266022190470925, 0.88266022190470925 ,0.5400000214576721, 2048);
+ GLfloat pm[] = { 1.372136116027832, 0, 0, 0, 0, 0.7910231351852417, 0, 0, -0.6352481842041016, 0.29297152161598206, -1.0005275011062622, -1, 0, 0, -1.080284833908081, 0 };
+ glLoadMatrixf(pm);
+
+ glMatrixMode(GL_MODELVIEW);
+ GLfloat matrixData[] = { -1, 0, 0, 0,
+ 0, 0,-1, 0,
+ 0, 1, 0, 0,
+ 0, 0, 0, 1 };
+ glLoadMatrixf(matrixData);
+
+ glActiveTexture(GL_TEXTURE0);
+
+ GLuint arrayBuffer, elementBuffer;
+ glGenBuffers(1, &arrayBuffer);
+ glGenBuffers(1, &elementBuffer);
+
+ GLubyte arrayData[] = {
+/*
+[0, 0, 0, 67] ==> 128 float
+[0, 0, 128, 67] ==> 256 float
+[0, 0, 0, 68] ==> 512 float
+[0, 0, 128, 68] ==> 1024 float
+
+[vertex x ] [vertex y ] [vertex z ] [nr] [texture u ] [texture v ] [lm u ] [lm v ] [color r,g,b,a ] */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128, // 0
+ 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128, // 1
+ 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 2
+ 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 3
+ 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128, // 4
+ 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 128, 67, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128, // 5
+ 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 128, 67, 0, 0, 0, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 6
+ 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 7
+ 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 8
+ 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 9
+ 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 128, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 10
+ 0, 0, 0, 0, 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 11
+ 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 12
+ 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 128, 67, 0, 0, 0, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 13
+ 0, 0, 128, 68, 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 128, 67, 0, 0, 128, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 14
+ 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 128, 67, 0, 0, 0, 0, 128, 128, 128, 128, // 15
+
+ 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 0, 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 128, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128,
+ 0, 0, 128, 68, 0, 0, 128, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128
+ };
+
+ // Generate a VAO
+ GLuint vao;
+ glGenVertexArrays(1, &vao);
+ glBindVertexArray(vao);
+
+ assert(sizeof(arrayData) == 1408);
+ glBindBuffer(GL_ARRAY_BUFFER, arrayBuffer);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(arrayData), arrayData, GL_STATIC_DRAW);
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
+
+ GLushort elementData[] = { 1, 2, 0, 2, 3, 0, 5, 6, 4, 6, 7, 4, 9, 10, 8, 10, 11, 8, 13, 14, 12, 14, 15, 12 };
+ assert(sizeof(elementData) == 48);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementBuffer);
+ glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(elementData), elementData, GL_STATIC_DRAW);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+
+ glBindBuffer(GL_ARRAY_BUFFER, arrayBuffer);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementBuffer);
+
+ glBindTexture(GL_TEXTURE_2D, texture); // diffuse?
+ glActiveTexture(GL_TEXTURE0);
+ glActiveTexture(GL_TEXTURE1);
+ glBindTexture(GL_TEXTURE_2D, texture2); // lightmap?
+ glActiveTexture(GL_TEXTURE0);
+
+ GLint ok;
+
+ const char *vertexShader = "attribute vec4 a_position;\n"
+ "attribute vec4 a_texCoord0;\n"
+ "uniform mat4 u_modelView;\n"
+ "uniform mat4 u_projection;\n"
+ "varying vec4 v_texCoord0;\n"
+ "void main(void)\n"
+ "{\n"
+ " gl_Position = (u_projection * u_modelView * a_position) + vec4(200, 0, 0, 0);\n"
+ " v_texCoord0.xy = a_texCoord0.xy/20.0;\n" // added /20 here
+ "}\n";
+ const char *fragmentShader = "uniform sampler2D diffusemap;\n"
+ "varying vec4 v_texCoord0;\n"
+ "void main(void)\n"
+ "{\n"
+ " vec4 diffuse = texture2D(diffusemap, v_texCoord0.xy);\n"
+ " gl_FragColor = diffuse;\n"
+ "}\n";
+
+ GLuint vs = glCreateShader(GL_VERTEX_SHADER);
+ glShaderSource(vs, 1, &vertexShader, NULL);
+ glCompileShader(vs);
+ glGetShaderiv(vs, GL_COMPILE_STATUS, &ok);
+ if (!ok) {
+ printf("Shader compilation error with vertex\n");
+ GLint infoLen = 0;
+ glGetShaderiv (vs, GL_INFO_LOG_LENGTH, &infoLen);
+ if (infoLen > 1)
+ {
+ char* infoLog = (char *)malloc(sizeof(char) * infoLen+1);
+ glGetShaderInfoLog(vs, infoLen, NULL, infoLog);
+ printf("Error compiling shader:\n%s\n", infoLog);
+ }
+ }
+
+ GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
+ glShaderSource(fs, 1, &fragmentShader, NULL);
+ glCompileShader(fs);
+ glGetShaderiv(fs, GL_COMPILE_STATUS, &ok);
+ if (!ok) {
+ printf("Shader compilation error with fragment\n");
+ GLint infoLen = 0;
+ glGetShaderiv (vs, GL_INFO_LOG_LENGTH, &infoLen);
+ if (infoLen > 1)
+ {
+ char* infoLog = (char *)malloc(sizeof(char) * infoLen+1);
+ glGetShaderInfoLog(vs, infoLen, NULL, infoLog);
+ printf("Error compiling shader:\n%s\n", infoLog);
+ }
+ }
+
+ GLuint program = glCreateProgram();
+
+ glAttachShader(program, vs);
+ glAttachShader(program, fs);
+ glLinkProgram(program);
+ glGetProgramiv(program, GL_LINK_STATUS, &ok);
+ assert(ok);
+
+ glUseProgram(program);
+
+ GLint diffusemapLocation = glGetUniformLocation(program, "diffusemap");
+ assert(diffusemapLocation >= 0);
+ glUniform1i(diffusemapLocation, 0);
+
+ {
+ GLfloat data[16];
+ glGetFloatv(GL_MODELVIEW_MATRIX, data);
+ printf("Modelview: ");
+ for (int i = 0; i < 16; i++) printf("%.3f, ", data[i]);
+ printf("\n");
+ GLint modelViewLocation = glGetUniformLocation(program, "u_modelView");
+ assert(modelViewLocation >= 0);
+ glUniformMatrix4fv(modelViewLocation, 1, GL_FALSE, data);
+ }
+ {
+ GLfloat data[16];
+ glGetFloatv(GL_PROJECTION_MATRIX, data);
+ printf("Projection: ");
+ for (int i = 0; i < 16; i++) printf("%.3f, ", data[i]);
+ printf("\n");
+ GLint projectionLocation = glGetUniformLocation(program, "u_projection");
+ assert(projectionLocation >= 0);
+ glUniformMatrix4fv(projectionLocation, 1, GL_FALSE, data);
+ }
+
+ glBindAttribLocation(program, 0, "a_position");
+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 32, (void*)0);
+ glEnableVertexAttribArray(0);
+
+ glBindAttribLocation(program, 1, "a_texCoord0");
+ glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 32, (void*)16);
+ glEnableVertexAttribArray(1);
+
+ // stop recording in the VAO
+
+ glBindVertexArray(0);
+
+ // unbind all the stuff the VAO would save for us, so this is a valid test
+
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+
+ glDisableVertexAttribArray(0);
+ glDisableVertexAttribArray(1);
+
+ // draw with VAO
+
+ glBindVertexArray(vao);
+
+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, (void*)12);
+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, (void*) 0);
+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, (void*)24);
+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, (void*)36);
+
+ glBindVertexArray(0);
+
+ glDeleteVertexArrays(1, &vao);
+
+ // END
+
+ SDL_GL_SwapBuffers();
+
+ verify();
+
+#if !EMSCRIPTEN
+ SDL_Delay(1500);
+#endif
+
+ SDL_Quit();
+
+ return 0;
+}
diff --git a/tests/float_tex.png b/tests/float_tex.png
index 8c3c6502..8fc005ff 100644
--- a/tests/float_tex.png
+++ b/tests/float_tex.png
Binary files differ
diff --git a/tests/fuzz/1.c b/tests/fuzz/1.c
new file mode 100644
index 00000000..2017fb76
--- /dev/null
+++ b/tests/fuzz/1.c
@@ -0,0 +1,117 @@
+/*
+ * This is a RANDOMLY GENERATED PROGRAM.
+ *
+ * Generator: csmith 2.2.0
+ * Git version: a8697aa
+ * Options: --no-volatiles --no-math64 --max-block-depth 2 --max-block-size 2 --max-expr-complexity 2 --max-funcs 2
+ * Seed: 1880513882
+ */
+
+#include "csmith.h"
+
+
+static long __undefined;
+
+/* --- Struct/Union Declarations --- */
+union U0 {
+ int32_t f0;
+ int8_t f1;
+ const int8_t f2;
+};
+
+/* --- GLOBAL VARIABLES --- */
+static uint32_t g_4 = 9UL;
+static int32_t g_6 = 0xB9DD952EL;
+static const int32_t *g_5 = &g_6;
+static union U0 g_7[3][9][6] = {{{{-8L},{5L},{0x901516EAL},{7L},{7L},{0x901516EAL}},{{0x520EA0C8L},{0x520EA0C8L},{0x0920A6FFL},{0x0021FBB9L},{0x888C5540L},{-8L}},{{0xDC87A9B6L},{0x42B48371L},{8L},{7L},{-8L},{0x0920A6FFL}},{{-1L},{0xDC87A9B6L},{8L},{5L},{0x520EA0C8L},{-8L}},{{-3L},{5L},{0x0920A6FFL},{0x865B49D5L},{0xDC87A9B6L},{0x901516EAL}},{{0x865B49D5L},{0xDC87A9B6L},{0x901516EAL},{0x0021FBB9L},{-1L},{-1L}},{{0x865B49D5L},{0x42B48371L},{0x42B48371L},{0x865B49D5L},{-3L},{0x0920A6FFL}},{{-3L},{0x520EA0C8L},{0x0021FBB9L},{5L},{0x865B49D5L},{-1L}},{{-1L},{5L},{0L},{7L},{0x865B49D5L},{0x901516EAL}}},{{{0xDC87A9B6L},{0x520EA0C8L},{7L},{0x0021FBB9L},{-3L},{-8L}},{{0x520EA0C8L},{0x42B48371L},{5L},{7L},{-1L},{0x0920A6FFL}},{{-8L},{0xDC87A9B6L},{5L},{5L},{0xDC87A9B6L},{-8L}},{{0x888C5540L},{5L},{7L},{0x865B49D5L},{0x520EA0C8L},{0x901516EAL}},{{7L},{0xDC87A9B6L},{0L},{0x0021FBB9L},{-8L},{-1L}},{{7L},{0x42B48371L},{0x0021FBB9L},{0x865B49D5L},{0x888C5540L},{0x0920A6FFL}},{{0x888C5540L},{0x520EA0C8L},{0x42B48371L},{5L},{7L},{-1L}},{{-8L},{5L},{0x901516EAL},{7L},{7L},{0x901516EAL}},{{0x520EA0C8L},{0x520EA0C8L},{0x0920A6FFL},{0x0021FBB9L},{0x888C5540L},{-8L}}},{{{0xDC87A9B6L},{0x42B48371L},{8L},{7L},{-8L},{0x0920A6FFL}},{{-1L},{0xDC87A9B6L},{8L},{5L},{0x520EA0C8L},{-8L}},{{-3L},{5L},{0x0920A6FFL},{0x865B49D5L},{0xDC87A9B6L},{0x901516EAL}},{{0x865B49D5L},{0xDC87A9B6L},{0x901516EAL},{0x0021FBB9L},{-1L},{-1L}},{{0x865B49D5L},{0x42B48371L},{0x42B48371L},{0x865B49D5L},{-3L},{0x0920A6FFL}},{{-3L},{0x520EA0C8L},{0x0021FBB9L},{5L},{0x865B49D5L},{-1L}},{{-1L},{5L},{0L},{7L},{0x865B49D5L},{0x901516EAL}},{{0xDC87A9B6L},{0x520EA0C8L},{7L},{0x0021FBB9L},{-3L},{-8L}},{{0x520EA0C8L},{0x42B48371L},{5L},{7L},{-1L},{0x0920A6FFL}}}};
+static int32_t g_31 = 1L;
+static uint32_t g_32 = 4294967289UL;
+
+
+/* --- FORWARD DECLARATIONS --- */
+static uint16_t func_1(void);
+static int32_t * func_9(int32_t * p_10, uint16_t p_11);
+
+
+/* --- FUNCTIONS --- */
+/* ------------------------------------------ */
+/*
+ * reads : g_4 g_5 g_7 g_32
+ * writes: g_5 g_32
+ */
+static uint16_t func_1(void)
+{ /* block id: 0 */
+ int32_t l_3 = (-1L);
+ if (((safe_unary_minus_func_int16_t_s(l_3)) >= g_4))
+ { /* block id: 1 */
+ int32_t *l_8 = &l_3;
+ g_5 = g_5;
+ (*l_8) ^= (g_7[1][3][2] , 0x44688D23L);
+ }
+ else
+ { /* block id: 4 */
+ int32_t *l_12 = &l_3;
+ int32_t **l_13 = &l_12;
+ (*l_13) = func_9(((*l_13) = l_12), l_3);
+ }
+ return l_3;
+}
+
+
+/* ------------------------------------------ */
+/*
+ * reads : g_32
+ * writes: g_32
+ */
+static int32_t * func_9(int32_t * p_10, uint16_t p_11)
+{ /* block id: 6 */
+ int32_t *l_14 = &g_6;
+ int32_t *l_15 = &g_7[1][3][2].f0;
+ int32_t *l_16 = &g_6;
+ int32_t *l_17 = &g_6;
+ int32_t *l_18 = &g_6;
+ int32_t *l_19 = &g_6;
+ int32_t *l_20 = &g_6;
+ int32_t *l_21 = &g_6;
+ int32_t *l_22 = &g_6;
+ int32_t *l_23 = &g_7[1][3][2].f0;
+ int32_t l_24[8] = {0xF9F11119L,0xF9F11119L,0xF9F11119L,0xF9F11119L,0xF9F11119L,0xF9F11119L,0xF9F11119L,0xF9F11119L};
+ int32_t *l_25 = &l_24[7];
+ int32_t *l_26 = &l_24[2];
+ int32_t *l_27 = &l_24[2];
+ int32_t *l_28 = &l_24[0];
+ int32_t *l_29 = &g_7[1][3][2].f0;
+ int32_t *l_30[10] = {(void*)0,(void*)0,(void*)0,(void*)0,(void*)0,(void*)0,(void*)0,(void*)0,(void*)0,(void*)0};
+ int i;
+ ++g_32;
+ return p_10;
+}
+
+
+
+
+/* ---------------------------------------- */
+int main (int argc, char* argv[])
+{
+ int i, j, k;
+ int print_hash_value = 0;
+ if (argc == 2 && strcmp(argv[1], "1") == 0) print_hash_value = 1;
+ platform_main_begin();
+ crc32_gentab();
+ func_1();
+ for (i = 0; i < 3; i++)
+ {
+ for (j = 0; j < 1; j++)
+ {
+ for (k = 0; k < 1; k++)
+ {
+ transparent_crc(g_7[i][j][k].f0, "g_7[i][j][k].f0", print_hash_value);
+ transparent_crc(g_7[i][j][k].f1, "g_7[i][j][k].f1", print_hash_value);
+ if (print_hash_value) printf("index = [%d][%d][%d]\n", i, j, k);
+ }
+ }
+ }
+ platform_main_end(crc32_context ^ 0xFFFFFFFFUL, print_hash_value);
+ return 0;
+}
+
diff --git a/tests/fuzz/1.c.txt b/tests/fuzz/1.c.txt
new file mode 100644
index 00000000..701369f3
--- /dev/null
+++ b/tests/fuzz/1.c.txt
@@ -0,0 +1 @@
+checksum = 504CCDC
diff --git a/tests/fuzz/2.c b/tests/fuzz/2.c
new file mode 100644
index 00000000..2063b2d1
--- /dev/null
+++ b/tests/fuzz/2.c
@@ -0,0 +1,2006 @@
+/*
+ * This is a RANDOMLY GENERATED PROGRAM.
+ *
+ * Generator: csmith 2.2.0
+ * Git version: 2751ded
+ * Options: --no-volatiles --no-math64
+ * Seed: 2601498443
+ */
+
+#include "csmith.h"
+
+
+static long __undefined;
+
+/* --- Struct/Union Declarations --- */
+#pragma pack(push)
+#pragma pack(1)
+struct S0 {
+ uint32_t f0;
+ int16_t f1;
+ const uint16_t f2;
+ uint16_t f3;
+ uint8_t f4;
+};
+#pragma pack(pop)
+
+struct S1 {
+ unsigned f0 : 4;
+ signed f1 : 23;
+ unsigned f2 : 21;
+ const unsigned f3 : 16;
+ unsigned f4 : 22;
+ signed f5 : 11;
+ signed f6 : 25;
+ unsigned f7 : 15;
+ unsigned f8 : 13;
+ uint32_t f9;
+};
+
+/* --- GLOBAL VARIABLES --- */
+static int32_t g_2 = 0xBD6C3F0BL;
+static uint8_t g_5 = 0xC4L;
+static struct S0 g_18 = {18446744073709551615UL,5L,0x0498L,0x20B5L,0xF6L};
+static int8_t g_36[8] = {0x09L,0x65L,0x09L,0x09L,0x65L,0x09L,0x09L,0x65L};
+static int32_t g_39 = 5L;
+static int8_t g_40 = 9L;
+static uint16_t g_71 = 0x2B10L;
+static uint16_t g_79 = 0UL;
+static struct S0 g_82 = {0xF60EFD82L,2L,0x24F1L,65530UL,7UL};
+static uint8_t g_119 = 4UL;
+static uint32_t g_195 = 0x6554C541L;
+static int32_t *g_199 = (void*)0;
+static int16_t g_208 = 0L;
+static uint32_t g_209 = 0UL;
+static int32_t **g_220 = &g_199;
+static uint16_t g_222 = 9UL;
+static int32_t g_237 = 0x16D0E17FL;
+static int32_t g_238 = (-6L);
+static int32_t g_240 = 5L;
+static uint32_t g_241 = 0x4C8054E4L;
+static uint32_t g_251 = 0x944D6970L;
+static uint8_t **g_254 = (void*)0;
+static int8_t g_279 = 0x60L;
+static int8_t g_280 = 1L;
+static int32_t g_281 = 0x4E1FA7EEL;
+static uint16_t g_282 = 1UL;
+static int16_t *g_313[9][9][3] = {{{&g_208,&g_82.f1,(void*)0},{&g_82.f1,(void*)0,&g_208},{&g_208,&g_18.f1,(void*)0},{&g_82.f1,(void*)0,(void*)0},{&g_18.f1,&g_208,&g_82.f1},{&g_82.f1,&g_82.f1,&g_18.f1},{&g_208,&g_208,&g_18.f1},{&g_82.f1,&g_208,(void*)0},{&g_208,(void*)0,&g_18.f1}},{{&g_82.f1,&g_208,&g_18.f1},{&g_82.f1,&g_208,&g_208},{(void*)0,(void*)0,&g_82.f1},{&g_208,&g_208,&g_208},{&g_208,&g_18.f1,&g_208},{(void*)0,&g_208,&g_208},{(void*)0,(void*)0,&g_208},{&g_82.f1,(void*)0,&g_208},{&g_208,(void*)0,&g_208}},{{&g_18.f1,&g_208,&g_208},{&g_82.f1,&g_208,&g_18.f1},{&g_208,&g_18.f1,&g_82.f1},{&g_18.f1,&g_18.f1,&g_208},{&g_18.f1,&g_18.f1,&g_18.f1},{&g_208,(void*)0,(void*)0},{&g_82.f1,&g_18.f1,&g_82.f1},{&g_18.f1,(void*)0,&g_82.f1},{&g_208,&g_18.f1,&g_18.f1}},{{&g_82.f1,&g_18.f1,&g_208},{(void*)0,&g_18.f1,(void*)0},{(void*)0,(void*)0,&g_82.f1},{&g_208,&g_18.f1,(void*)0},{&g_208,(void*)0,&g_82.f1},{&g_18.f1,&g_18.f1,&g_208},{(void*)0,&g_18.f1,&g_208},{(void*)0,&g_18.f1,&g_82.f1},{(void*)0,&g_208,(void*)0}},{{&g_18.f1,&g_208,&g_82.f1},{&g_82.f1,(void*)0,(void*)0},{(void*)0,(void*)0,&g_208},{&g_82.f1,(void*)0,&g_18.f1},{(void*)0,&g_208,&g_82.f1},{&g_82.f1,&g_18.f1,&g_82.f1},{&g_18.f1,(void*)0,(void*)0},{(void*)0,&g_208,&g_18.f1},{(void*)0,&g_208,&g_18.f1}},{{&g_18.f1,&g_208,&g_18.f1},{(void*)0,&g_82.f1,&g_18.f1},{&g_208,&g_82.f1,&g_82.f1},{&g_18.f1,&g_208,(void*)0},{&g_82.f1,&g_208,&g_18.f1},{&g_208,&g_208,&g_208},{(void*)0,&g_82.f1,&g_18.f1},{&g_208,&g_208,(void*)0},{&g_18.f1,&g_82.f1,&g_82.f1}},{{&g_18.f1,&g_208,&g_18.f1},{&g_18.f1,(void*)0,&g_18.f1},{&g_208,&g_18.f1,&g_18.f1},{&g_208,&g_18.f1,&g_18.f1},{&g_18.f1,&g_82.f1,&g_82.f1},{&g_18.f1,&g_208,&g_18.f1},{&g_18.f1,&g_208,(void*)0},{&g_208,&g_18.f1,&g_18.f1},{(void*)0,(void*)0,(void*)0}},{{&g_208,&g_18.f1,&g_82.f1},{&g_82.f1,&g_208,&g_82.f1},{&g_18.f1,&g_208,(void*)0},{&g_208,&g_82.f1,&g_18.f1},{(void*)0,&g_18.f1,&g_82.f1},{&g_18.f1,&g_18.f1,&g_82.f1},{(void*)0,(void*)0,&g_18.f1},{&g_208,&g_208,(void*)0},{&g_208,&g_82.f1,&g_82.f1}},{{(void*)0,&g_208,&g_82.f1},{&g_18.f1,&g_82.f1,(void*)0},{&g_208,&g_208,&g_18.f1},{&g_18.f1,&g_208,(void*)0},{(void*)0,&g_82.f1,&g_208},{&g_18.f1,&g_82.f1,&g_208},{(void*)0,&g_82.f1,(void*)0},{(void*)0,&g_208,&g_82.f1},{&g_82.f1,&g_208,&g_82.f1}}};
+static uint32_t g_347 = 0xC4FCF803L;
+static int32_t *g_366 = &g_240;
+static int32_t **g_365 = &g_366;
+static struct S1 g_391 = {1,2228,1279,15,579,-29,789,104,13,4294967287UL};
+static struct S1 *g_390 = &g_391;
+static uint32_t g_408 = 0xCF847D91L;
+static int32_t g_433 = 0x55EDE5F7L;
+static int32_t g_434 = 0xB4C5C7AAL;
+static int32_t g_499[3][1] = {{0x2CC689D6L},{0x2CC689D6L},{0x2CC689D6L}};
+static int32_t g_500 = 8L;
+static uint32_t g_501 = 7UL;
+static struct S0 g_508[9][4][7] = {{{{0x66A29370L,1L,65533UL,0x58A9L,0xE0L},{0x66A29370L,1L,65533UL,0x58A9L,0xE0L},{0x2EB9A52EL,0x9EFDL,0x49E1L,0xB224L,0x6FL},{0x1A87F5EEL,0xD3E2L,0xED27L,65535UL,255UL},{0xDD780AAAL,0L,65532UL,0x908CL,0xFDL},{0x1A87F5EEL,0xD3E2L,0xED27L,65535UL,255UL},{0x2EB9A52EL,0x9EFDL,0x49E1L,0xB224L,0x6FL}},{{0xD58F413CL,0xF25BL,65531UL,0xB870L,0UL},{0xD58F413CL,0xF25BL,65531UL,0xB870L,0UL},{18446744073709551615UL,1L,0x9E3EL,0xDB7DL,1UL},{0x1A9DC0E9L,0x3641L,65527UL,0xD3FCL,1UL},{18446744073709551612UL,-1L,1UL,0x787BL,0UL},{0x1A9DC0E9L,0x3641L,65527UL,0xD3FCL,1UL},{18446744073709551615UL,1L,0x9E3EL,0xDB7DL,1UL}},{{0x66A29370L,1L,65533UL,0x58A9L,0xE0L},{0x66A29370L,1L,65533UL,0x58A9L,0xE0L},{0x2EB9A52EL,0x9EFDL,0x49E1L,0xB224L,0x6FL},{0x1A87F5EEL,0xD3E2L,0xED27L,65535UL,255UL},{0xDD780AAAL,0L,65532UL,0x908CL,0xFDL},{0x1A87F5EEL,0xD3E2L,0xED27L,65535UL,255UL},{0x2EB9A52EL,0x9EFDL,0x49E1L,0xB224L,0x6FL}},{{0xD58F413CL,0xF25BL,65531UL,0xB870L,0UL},{0xD58F413CL,0xF25BL,65531UL,0xB870L,0UL},{18446744073709551615UL,1L,0x9E3EL,0xDB7DL,1UL},{0x1A9DC0E9L,0x3641L,65527UL,0xD3FCL,1UL},{18446744073709551612UL,-1L,1UL,0x787BL,0UL},{0x1A9DC0E9L,0x3641L,65527UL,0xD3FCL,1UL},{18446744073709551615UL,1L,0x9E3EL,0xDB7DL,1UL}}},{{{0x66A29370L,1L,65533UL,0x58A9L,0xE0L},{0x66A29370L,1L,65533UL,0x58A9L,0xE0L},{0x2EB9A52EL,0x9EFDL,0x49E1L,0xB224L,0x6FL},{0x1A87F5EEL,0xD3E2L,0xED27L,65535UL,255UL},{0xDD780AAAL,0L,65532UL,0x908CL,0xFDL},{0x1A87F5EEL,0xD3E2L,0xED27L,65535UL,255UL},{0x2EB9A52EL,0x9EFDL,0x49E1L,0xB224L,0x6FL}},{{0xD58F413CL,0xF25BL,65531UL,0xB870L,0UL},{0xD58F413CL,0xF25BL,65531UL,0xB870L,0UL},{18446744073709551615UL,1L,0x9E3EL,0xDB7DL,1UL},{0x1A9DC0E9L,0x3641L,65527UL,0xD3FCL,1UL},{18446744073709551612UL,-1L,1UL,0x787BL,0UL},{0x1A9DC0E9L,0x3641L,65527UL,0xD3FCL,1UL},{18446744073709551615UL,1L,0x9E3EL,0xDB7DL,1UL}},{{0x66A29370L,1L,65533UL,0x58A9L,0xE0L},{0x66A29370L,1L,65533UL,0x58A9L,0xE0L},{0x2EB9A52EL,0x9EFDL,0x49E1L,0xB224L,0x6FL},{0x1A87F5EEL,0xD3E2L,0xED27L,65535UL,255UL},{0xDD780AAAL,0L,65532UL,0x908CL,0xFDL},{0x1A87F5EEL,0xD3E2L,0xED27L,65535UL,255UL},{0x2EB9A52EL,0x9EFDL,0x49E1L,0xB224L,0x6FL}},{{0xD58F413CL,0xF25BL,65531UL,0xB870L,0UL},{0xD58F413CL,0xF25BL,65531UL,0xB870L,0UL},{18446744073709551615UL,1L,0x9E3EL,0xDB7DL,1UL},{0x1A9DC0E9L,0x3641L,65527UL,0xD3FCL,1UL},{18446744073709551612UL,-1L,1UL,0x787BL,0UL},{0x1A9DC0E9L,0x3641L,65527UL,0xD3FCL,1UL},{18446744073709551615UL,1L,0x9E3EL,0xDB7DL,1UL}}},{{{0x66A29370L,1L,65533UL,0x58A9L,0xE0L},{0x66A29370L,1L,65533UL,0x58A9L,0xE0L},{0x2EB9A52EL,0x9EFDL,0x49E1L,0xB224L,0x6FL},{0x1A87F5EEL,0xD3E2L,0xED27L,65535UL,255UL},{0xDD780AAAL,0L,65532UL,0x908CL,0xFDL},{0x1A87F5EEL,0xD3E2L,0xED27L,65535UL,255UL},{0x2EB9A52EL,0x9EFDL,0x49E1L,0xB224L,0x6FL}},{{0xD58F413CL,0xF25BL,65531UL,0xB870L,0UL},{0xD58F413CL,0xF25BL,65531UL,0xB870L,0UL},{18446744073709551615UL,1L,0x9E3EL,0xDB7DL,1UL},{0x1A9DC0E9L,0x3641L,65527UL,0xD3FCL,1UL},{18446744073709551612UL,-1L,1UL,0x787BL,0UL},{0x1A9DC0E9L,0x3641L,65527UL,0xD3FCL,1UL},{18446744073709551615UL,1L,0x9E3EL,0xDB7DL,1UL}},{{0x66A29370L,1L,65533UL,0x58A9L,0xE0L},{0x66A29370L,1L,65533UL,0x58A9L,0xE0L},{0x2EB9A52EL,0x9EFDL,0x49E1L,0xB224L,0x6FL},{0x1A87F5EEL,0xD3E2L,0xED27L,65535UL,255UL},{0xDD780AAAL,0L,65532UL,0x908CL,0xFDL},{0x1A87F5EEL,0xD3E2L,0xED27L,65535UL,255UL},{0x2EB9A52EL,0x9EFDL,0x49E1L,0xB224L,0x6FL}},{{0xD58F413CL,0xF25BL,65531UL,0xB870L,0UL},{18446744073709551615UL,1L,0x9E3EL,0xDB7DL,1UL},{6UL,-1L,7UL,3UL,0xB7L},{18446744073709551615UL,0x582EL,8UL,0x124DL,1UL},{0xD58F413CL,0xF25BL,65531UL,0xB870L,0UL},{18446744073709551615UL,0x582EL,8UL,0x124DL,1UL},{6UL,-1L,7UL,3UL,0xB7L}}},{{{0x2EB9A52EL,0x9EFDL,0x49E1L,0xB224L,0x6FL},{0x2EB9A52EL,0x9EFDL,0x49E1L,0xB224L,0x6FL},{0xCB5D2F36L,5L,0xAAE3L,4UL,0x1FL},{1UL,-9L,0x4EAEL,0x67B1L,0x62L},{0x66A29370L,1L,65533UL,0x58A9L,0xE0L},{1UL,-9L,0x4EAEL,0x67B1L,0x62L},{0xCB5D2F36L,5L,0xAAE3L,4UL,0x1FL}},{{18446744073709551615UL,1L,0x9E3EL,0xDB7DL,1UL},{18446744073709551615UL,1L,0x9E3EL,0xDB7DL,1UL},{6UL,-1L,7UL,3UL,0xB7L},{18446744073709551615UL,0x582EL,8UL,0x124DL,1UL},{0xD58F413CL,0xF25BL,65531UL,0xB870L,0UL},{18446744073709551615UL,0x582EL,8UL,0x124DL,1UL},{6UL,-1L,7UL,3UL,0xB7L}},{{0x2EB9A52EL,0x9EFDL,0x49E1L,0xB224L,0x6FL},{0x2EB9A52EL,0x9EFDL,0x49E1L,0xB224L,0x6FL},{0xCB5D2F36L,5L,0xAAE3L,4UL,0x1FL},{1UL,-9L,0x4EAEL,0x67B1L,0x62L},{0x66A29370L,1L,65533UL,0x58A9L,0xE0L},{1UL,-9L,0x4EAEL,0x67B1L,0x62L},{0xCB5D2F36L,5L,0xAAE3L,4UL,0x1FL}},{{18446744073709551615UL,1L,0x9E3EL,0xDB7DL,1UL},{18446744073709551615UL,1L,0x9E3EL,0xDB7DL,1UL},{6UL,-1L,7UL,3UL,0xB7L},{18446744073709551615UL,0x582EL,8UL,0x124DL,1UL},{0xD58F413CL,0xF25BL,65531UL,0xB870L,0UL},{18446744073709551615UL,0x582EL,8UL,0x124DL,1UL},{6UL,-1L,7UL,3UL,0xB7L}}},{{{0x2EB9A52EL,0x9EFDL,0x49E1L,0xB224L,0x6FL},{0x2EB9A52EL,0x9EFDL,0x49E1L,0xB224L,0x6FL},{0xCB5D2F36L,5L,0xAAE3L,4UL,0x1FL},{1UL,-9L,0x4EAEL,0x67B1L,0x62L},{0x66A29370L,1L,65533UL,0x58A9L,0xE0L},{1UL,-9L,0x4EAEL,0x67B1L,0x62L},{0xCB5D2F36L,5L,0xAAE3L,4UL,0x1FL}},{{18446744073709551615UL,1L,0x9E3EL,0xDB7DL,1UL},{18446744073709551615UL,1L,0x9E3EL,0xDB7DL,1UL},{6UL,-1L,7UL,3UL,0xB7L},{18446744073709551615UL,0x582EL,8UL,0x124DL,1UL},{0xD58F413CL,0xF25BL,65531UL,0xB870L,0UL},{18446744073709551615UL,0x582EL,8UL,0x124DL,1UL},{6UL,-1L,7UL,3UL,0xB7L}},{{0x2EB9A52EL,0x9EFDL,0x49E1L,0xB224L,0x6FL},{0x2EB9A52EL,0x9EFDL,0x49E1L,0xB224L,0x6FL},{0xCB5D2F36L,5L,0xAAE3L,4UL,0x1FL},{1UL,-9L,0x4EAEL,0x67B1L,0x62L},{0x66A29370L,1L,65533UL,0x58A9L,0xE0L},{1UL,-9L,0x4EAEL,0x67B1L,0x62L},{0xCB5D2F36L,5L,0xAAE3L,4UL,0x1FL}},{{18446744073709551615UL,1L,0x9E3EL,0xDB7DL,1UL},{18446744073709551615UL,1L,0x9E3EL,0xDB7DL,1UL},{6UL,-1L,7UL,3UL,0xB7L},{18446744073709551615UL,0x582EL,8UL,0x124DL,1UL},{0xD58F413CL,0xF25BL,65531UL,0xB870L,0UL},{18446744073709551615UL,0x582EL,8UL,0x124DL,1UL},{6UL,-1L,7UL,3UL,0xB7L}}},{{{0x2EB9A52EL,0x9EFDL,0x49E1L,0xB224L,0x6FL},{0x2EB9A52EL,0x9EFDL,0x49E1L,0xB224L,0x6FL},{0xCB5D2F36L,5L,0xAAE3L,4UL,0x1FL},{1UL,-9L,0x4EAEL,0x67B1L,0x62L},{0x66A29370L,1L,65533UL,0x58A9L,0xE0L},{1UL,-9L,0x4EAEL,0x67B1L,0x62L},{0xCB5D2F36L,5L,0xAAE3L,4UL,0x1FL}},{{18446744073709551615UL,1L,0x9E3EL,0xDB7DL,1UL},{18446744073709551615UL,1L,0x9E3EL,0xDB7DL,1UL},{6UL,-1L,7UL,3UL,0xB7L},{18446744073709551615UL,0x582EL,8UL,0x124DL,1UL},{0xD58F413CL,0xF25BL,65531UL,0xB870L,0UL},{18446744073709551615UL,0x582EL,8UL,0x124DL,1UL},{6UL,-1L,7UL,3UL,0xB7L}},{{0x2EB9A52EL,0x9EFDL,0x49E1L,0xB224L,0x6FL},{0x2EB9A52EL,0x9EFDL,0x49E1L,0xB224L,0x6FL},{0xCB5D2F36L,5L,0xAAE3L,4UL,0x1FL},{1UL,-9L,0x4EAEL,0x67B1L,0x62L},{0x66A29370L,1L,65533UL,0x58A9L,0xE0L},{1UL,-9L,0x4EAEL,0x67B1L,0x62L},{0xCB5D2F36L,5L,0xAAE3L,4UL,0x1FL}},{{18446744073709551615UL,1L,0x9E3EL,0xDB7DL,1UL},{18446744073709551615UL,1L,0x9E3EL,0xDB7DL,1UL},{6UL,-1L,7UL,3UL,0xB7L},{18446744073709551615UL,0x582EL,8UL,0x124DL,1UL},{0xD58F413CL,0xF25BL,65531UL,0xB870L,0UL},{18446744073709551615UL,0x582EL,8UL,0x124DL,1UL},{6UL,-1L,7UL,3UL,0xB7L}}},{{{0x2EB9A52EL,0x9EFDL,0x49E1L,0xB224L,0x6FL},{0x2EB9A52EL,0x9EFDL,0x49E1L,0xB224L,0x6FL},{0xCB5D2F36L,5L,0xAAE3L,4UL,0x1FL},{1UL,-9L,0x4EAEL,0x67B1L,0x62L},{0x66A29370L,1L,65533UL,0x58A9L,0xE0L},{0xCB5D2F36L,5L,0xAAE3L,4UL,0x1FL},{0x66A29370L,1L,65533UL,0x58A9L,0xE0L}},{{18446744073709551612UL,-1L,1UL,0x787BL,0UL},{18446744073709551612UL,-1L,1UL,0x787BL,0UL},{0xD58F413CL,0xF25BL,65531UL,0xB870L,0UL},{6UL,-1L,7UL,3UL,0xB7L},{0UL,0x1B92L,0UL,0x6816L,0x23L},{6UL,-1L,7UL,3UL,0xB7L},{0xD58F413CL,0xF25BL,65531UL,0xB870L,0UL}},{{0xDD780AAAL,0L,65532UL,0x908CL,0xFDL},{0xDD780AAAL,0L,65532UL,0x908CL,0xFDL},{0x66A29370L,1L,65533UL,0x58A9L,0xE0L},{0xCB5D2F36L,5L,0xAAE3L,4UL,0x1FL},{5UL,0x69A3L,0x0436L,0x936DL,0xAAL},{0xCB5D2F36L,5L,0xAAE3L,4UL,0x1FL},{0x66A29370L,1L,65533UL,0x58A9L,0xE0L}},{{18446744073709551612UL,-1L,1UL,0x787BL,0UL},{18446744073709551612UL,-1L,1UL,0x787BL,0UL},{0xD58F413CL,0xF25BL,65531UL,0xB870L,0UL},{6UL,-1L,7UL,3UL,0xB7L},{0UL,0x1B92L,0UL,0x6816L,0x23L},{6UL,-1L,7UL,3UL,0xB7L},{0xD58F413CL,0xF25BL,65531UL,0xB870L,0UL}}},{{{0xDD780AAAL,0L,65532UL,0x908CL,0xFDL},{0xDD780AAAL,0L,65532UL,0x908CL,0xFDL},{0x66A29370L,1L,65533UL,0x58A9L,0xE0L},{0xCB5D2F36L,5L,0xAAE3L,4UL,0x1FL},{5UL,0x69A3L,0x0436L,0x936DL,0xAAL},{0xCB5D2F36L,5L,0xAAE3L,4UL,0x1FL},{0x66A29370L,1L,65533UL,0x58A9L,0xE0L}},{{18446744073709551612UL,-1L,1UL,0x787BL,0UL},{18446744073709551612UL,-1L,1UL,0x787BL,0UL},{0xD58F413CL,0xF25BL,65531UL,0xB870L,0UL},{6UL,-1L,7UL,3UL,0xB7L},{0UL,0x1B92L,0UL,0x6816L,0x23L},{6UL,-1L,7UL,3UL,0xB7L},{0xD58F413CL,0xF25BL,65531UL,0xB870L,0UL}},{{0xDD780AAAL,0L,65532UL,0x908CL,0xFDL},{0xDD780AAAL,0L,65532UL,0x908CL,0xFDL},{0x66A29370L,1L,65533UL,0x58A9L,0xE0L},{0xCB5D2F36L,5L,0xAAE3L,4UL,0x1FL},{5UL,0x69A3L,0x0436L,0x936DL,0xAAL},{0xCB5D2F36L,5L,0xAAE3L,4UL,0x1FL},{0x66A29370L,1L,65533UL,0x58A9L,0xE0L}},{{18446744073709551612UL,-1L,1UL,0x787BL,0UL},{18446744073709551612UL,-1L,1UL,0x787BL,0UL},{0xD58F413CL,0xF25BL,65531UL,0xB870L,0UL},{6UL,-1L,7UL,3UL,0xB7L},{0UL,0x1B92L,0UL,0x6816L,0x23L},{6UL,-1L,7UL,3UL,0xB7L},{0xD58F413CL,0xF25BL,65531UL,0xB870L,0UL}}},{{{0xDD780AAAL,0L,65532UL,0x908CL,0xFDL},{0xDD780AAAL,0L,65532UL,0x908CL,0xFDL},{0x66A29370L,1L,65533UL,0x58A9L,0xE0L},{0xCB5D2F36L,5L,0xAAE3L,4UL,0x1FL},{5UL,0x69A3L,0x0436L,0x936DL,0xAAL},{0xCB5D2F36L,5L,0xAAE3L,4UL,0x1FL},{0x66A29370L,1L,65533UL,0x58A9L,0xE0L}},{{18446744073709551612UL,-1L,1UL,0x787BL,0UL},{18446744073709551612UL,-1L,1UL,0x787BL,0UL},{0xD58F413CL,0xF25BL,65531UL,0xB870L,0UL},{6UL,-1L,7UL,3UL,0xB7L},{0UL,0x1B92L,0UL,0x6816L,0x23L},{6UL,-1L,7UL,3UL,0xB7L},{0xD58F413CL,0xF25BL,65531UL,0xB870L,0UL}},{{0xDD780AAAL,0L,65532UL,0x908CL,0xFDL},{0xDD780AAAL,0L,65532UL,0x908CL,0xFDL},{0x66A29370L,1L,65533UL,0x58A9L,0xE0L},{0xCB5D2F36L,5L,0xAAE3L,4UL,0x1FL},{5UL,0x69A3L,0x0436L,0x936DL,0xAAL},{0xCB5D2F36L,5L,0xAAE3L,4UL,0x1FL},{0x66A29370L,1L,65533UL,0x58A9L,0xE0L}},{{18446744073709551612UL,-1L,1UL,0x787BL,0UL},{18446744073709551612UL,-1L,1UL,0x787BL,0UL},{0xD58F413CL,0xF25BL,65531UL,0xB870L,0UL},{6UL,-1L,7UL,3UL,0xB7L},{0UL,0x1B92L,0UL,0x6816L,0x23L},{6UL,-1L,7UL,3UL,0xB7L},{0xD58F413CL,0xF25BL,65531UL,0xB870L,0UL}}}};
+static int8_t *g_512 = (void*)0;
+static int8_t **g_511 = &g_512;
+static int8_t g_537[3] = {(-4L),(-4L),(-4L)};
+static int32_t g_540 = 0xE36F71D3L;
+static int32_t g_541 = (-4L);
+static uint32_t g_542 = 1UL;
+static int32_t g_553 = 0x2FE5E350L;
+static uint8_t g_555[1][2] = {{0x6EL,0x6EL}};
+static const int32_t g_564 = 0x25327763L;
+static uint16_t *g_601 = (void*)0;
+static const int32_t *g_628 = &g_499[2][0];
+static const int32_t **g_627[6][9][4] = {{{&g_628,&g_628,(void*)0,&g_628},{&g_628,&g_628,(void*)0,&g_628},{(void*)0,&g_628,(void*)0,&g_628},{&g_628,&g_628,(void*)0,&g_628},{&g_628,&g_628,(void*)0,&g_628},{(void*)0,&g_628,(void*)0,&g_628},{&g_628,&g_628,(void*)0,&g_628},{&g_628,&g_628,(void*)0,&g_628},{(void*)0,&g_628,(void*)0,&g_628}},{{&g_628,&g_628,(void*)0,&g_628},{&g_628,&g_628,(void*)0,&g_628},{(void*)0,&g_628,(void*)0,&g_628},{&g_628,&g_628,(void*)0,&g_628},{&g_628,&g_628,(void*)0,&g_628},{(void*)0,&g_628,(void*)0,&g_628},{&g_628,&g_628,(void*)0,&g_628},{&g_628,&g_628,(void*)0,&g_628},{(void*)0,&g_628,(void*)0,&g_628}},{{&g_628,&g_628,(void*)0,&g_628},{&g_628,&g_628,(void*)0,&g_628},{(void*)0,&g_628,(void*)0,&g_628},{&g_628,&g_628,(void*)0,&g_628},{&g_628,&g_628,(void*)0,&g_628},{(void*)0,&g_628,(void*)0,&g_628},{&g_628,&g_628,(void*)0,&g_628},{&g_628,&g_628,(void*)0,&g_628},{(void*)0,&g_628,(void*)0,&g_628}},{{(void*)0,&g_628,&g_628,&g_628},{(void*)0,&g_628,(void*)0,&g_628},{(void*)0,&g_628,(void*)0,&g_628},{(void*)0,&g_628,&g_628,&g_628},{(void*)0,&g_628,(void*)0,&g_628},{(void*)0,&g_628,(void*)0,&g_628},{(void*)0,&g_628,&g_628,&g_628},{(void*)0,&g_628,(void*)0,&g_628},{(void*)0,&g_628,(void*)0,&g_628}},{{(void*)0,&g_628,&g_628,&g_628},{(void*)0,&g_628,(void*)0,&g_628},{(void*)0,&g_628,(void*)0,&g_628},{(void*)0,&g_628,&g_628,&g_628},{(void*)0,&g_628,(void*)0,&g_628},{(void*)0,&g_628,(void*)0,&g_628},{(void*)0,&g_628,&g_628,&g_628},{(void*)0,&g_628,(void*)0,&g_628},{(void*)0,&g_628,(void*)0,&g_628}},{{(void*)0,&g_628,&g_628,&g_628},{(void*)0,&g_628,(void*)0,&g_628},{(void*)0,&g_628,(void*)0,&g_628},{(void*)0,&g_628,&g_628,&g_628},{(void*)0,&g_628,(void*)0,&g_628},{(void*)0,&g_628,(void*)0,&g_628},{(void*)0,&g_628,&g_628,&g_628},{(void*)0,&g_628,(void*)0,&g_628},{(void*)0,&g_628,(void*)0,&g_628}}};
+static int32_t *g_672[8] = {&g_434,&g_2,&g_434,&g_2,&g_434,&g_2,&g_434,&g_2};
+static uint16_t g_802 = 1UL;
+static int8_t g_809[5][1][8] = {{{(-1L),1L,(-1L),7L,0L,0x60L,0xEDL,0L}},{{0xA3L,(-1L),0xCFL,0x87L,0x50L,0L,0L,0L}},{{0xA3L,0L,0xA4L,0xA4L,0L,0xA3L,1L,7L}},{{(-1L),(-1L),0L,1L,0xCFL,(-6L),0L,0xEEL}},{{0x50L,7L,(-6L),1L,(-1L),1L,(-6L),7L}}};
+static uint32_t *g_825[3][2][1] = {{{&g_391.f9},{&g_391.f9}},{{&g_391.f9},{&g_391.f9}},{{&g_391.f9},{&g_391.f9}}};
+static int32_t g_876 = 0x2FE494ACL;
+static const int8_t g_910 = 0x63L;
+static uint16_t *** const g_962 = (void*)0;
+static int16_t g_1052 = 0xF859L;
+static uint16_t g_1105[9] = {0UL,0UL,0UL,0UL,0UL,0UL,0UL,0UL,0UL};
+static int32_t g_1109 = (-8L);
+static struct S1 g_1113 = {2,990,1094,87,364,-7,-4072,0,16,0x351C817AL};
+static uint32_t *g_1142[1][6][3] = {{{&g_241,&g_18.f0,&g_408},{&g_209,&g_209,&g_408},{&g_18.f0,&g_241,&g_18.f0},{&g_195,&g_209,&g_195},{&g_195,&g_18.f0,&g_209},{&g_18.f0,&g_195,&g_195}}};
+static uint32_t **g_1141 = &g_1142[0][1][1];
+static struct S0 g_1169 = {8UL,0x2BA0L,1UL,65530UL,0x66L};
+static struct S0 *g_1168 = &g_1169;
+static uint16_t g_1192[1][8] = {{0x03F8L,0x03F8L,0x03F8L,0x03F8L,0x03F8L,0x03F8L,0x03F8L,0x03F8L}};
+static int8_t g_1233[8] = {4L,0x9CL,4L,4L,0x9CL,4L,4L,0x9CL};
+static uint32_t g_1263 = 4294967287UL;
+static int16_t **g_1272[8] = {&g_313[1][2][2],&g_313[1][2][2],&g_313[1][2][2],&g_313[1][2][2],&g_313[1][2][2],&g_313[1][2][2],&g_313[1][2][2],&g_313[1][2][2]};
+static int16_t ***g_1271[10] = {&g_1272[1],&g_1272[1],&g_1272[1],&g_1272[1],&g_1272[1],&g_1272[1],&g_1272[1],&g_1272[1],&g_1272[1],&g_1272[1]};
+static int16_t ****g_1270 = &g_1271[3];
+static int16_t g_1389 = 0xD9C6L;
+static int8_t *g_1544[6] = {&g_40,&g_40,&g_40,&g_40,&g_40,&g_40};
+
+
+/* --- FORWARD DECLARATIONS --- */
+static uint16_t func_1(void);
+static int32_t * func_6(int8_t p_7, int32_t * p_8);
+static struct S0 func_9(int32_t * p_10, int32_t * p_11, int32_t * p_12);
+static int32_t * func_13(const int16_t p_14, int32_t * p_15, int32_t * p_16);
+static int32_t * func_19(int32_t * p_20, int32_t * p_21, struct S1 p_22);
+static struct S1 func_24(uint8_t p_25, int8_t p_26, int32_t * p_27, int32_t p_28);
+static uint32_t func_41(int32_t p_42, uint16_t * p_43, int32_t p_44, uint16_t p_45, int8_t * p_46);
+static const uint16_t func_52(const int8_t * p_53, struct S0 p_54, uint16_t * p_55);
+static const int8_t * func_56(int32_t * p_57, int16_t p_58, uint16_t * p_59, int8_t * p_60);
+static uint32_t func_87(uint32_t p_88);
+
+
+/* --- FUNCTIONS --- */
+/* ------------------------------------------ */
+/*
+ * reads : g_2 g_18 g_5 g_39 g_40 g_71 g_36 g_82 g_119 g_79 g_195 g_209 g_222 g_220 g_199 g_208 g_241 g_240 g_254 g_282 g_237 g_280 g_347 g_238 g_365 g_390 g_408 g_391.f4 g_391.f9 g_391 g_501 g_508.f0 g_541 g_508.f4 g_511 g_512 g_542 g_434 g_601 g_537 g_499 g_508.f2 g_627 g_251 g_508.f1 g_553 g_628 g_555 g_433 g_802 g_809 g_876 g_500 g_366 g_279 g_1105 g_1109 g_1192 g_1142 g_1389 g_1169.f1 g_508 g_1168 g_1169 g_1544
+ * writes: g_2 g_5 g_18.f3 g_36 g_39 g_40 g_71 g_18.f4 g_82.f1 g_119 g_82.f4 g_79 g_195 g_199 g_209 g_82.f3 g_220 g_222 g_241 g_251 g_282 g_280 g_313 g_237 g_347 g_238 g_365 g_390 g_366 g_408 g_208 g_501 g_500 g_542 g_18.f1 g_434 g_254 g_541 g_672 g_433 g_279 g_825 g_809 g_876 g_540 g_537 g_802 g_555 g_1105 g_1109 g_18.f0 g_1113.f9 g_1141 g_82.f0 g_1168 g_1169.f3 g_1192 g_1389 g_601 g_1169.f1 g_240
+ */
+static uint16_t func_1(void)
+{ /* block id: 0 */
+ const int32_t l_17 = 0x3AC9D73DL;
+ int32_t *l_23 = &g_2;
+ struct S1 l_33 = {2,-1611,502,54,563,-32,-5497,142,81,0xEA418246L};
+ uint16_t *l_34 = &g_18.f3;
+ int8_t *l_35[4][3][10] = {{{&g_36[3],&g_36[3],&g_36[3],&g_36[3],&g_36[3],(void*)0,&g_36[3],&g_36[7],&g_36[0],&g_36[7]},{&g_36[3],(void*)0,&g_36[3],&g_36[7],&g_36[3],(void*)0,&g_36[3],&g_36[3],&g_36[0],&g_36[6]},{&g_36[3],(void*)0,&g_36[3],&g_36[3],&g_36[3],&g_36[3],&g_36[3],&g_36[3],(void*)0,&g_36[3]}},{{&g_36[3],(void*)0,&g_36[0],&g_36[3],&g_36[7],&g_36[6],&g_36[3],&g_36[6],&g_36[7],&g_36[3]},{&g_36[3],(void*)0,&g_36[3],(void*)0,&g_36[7],&g_36[3],&g_36[3],&g_36[3],&g_36[3],&g_36[3]},{&g_36[7],&g_36[3],&g_36[3],&g_36[3],&g_36[3],&g_36[7],&g_36[3],&g_36[3],&g_36[0],&g_36[3]}},{{&g_36[3],&g_36[3],&g_36[3],&g_36[3],&g_36[3],&g_36[3],&g_36[3],&g_36[3],&g_36[3],&g_36[3]},{&g_36[3],(void*)0,&g_36[7],&g_36[3],&g_36[3],&g_36[3],&g_36[3],&g_36[3],&g_36[3],&g_36[7]},{&g_36[3],&g_36[3],&g_36[3],&g_36[3],&g_36[7],(void*)0,&g_36[3],(void*)0,&g_36[3],(void*)0}},{{&g_36[3],&g_36[3],&g_36[3],&g_36[3],&g_36[3],&g_36[3],&g_36[3],&g_36[3],&g_36[0],&g_36[0]},{&g_36[3],&g_36[3],&g_36[6],(void*)0,(void*)0,&g_36[6],&g_36[3],&g_36[3],&g_36[3],&g_36[0]},{(void*)0,(void*)0,&g_36[3],&g_36[3],&g_36[3],&g_36[3],&g_36[3],&g_36[3],&g_36[3],(void*)0}}};
+ int32_t *l_1108 = &g_1109;
+ int32_t *l_1545 = &g_238;
+ uint16_t l_1556 = 0x4844L;
+ int32_t *l_1557 = &g_433;
+ struct S0 *l_1560 = &g_1169;
+ int i, j, k;
+ for (g_2 = 0; (g_2 == 11); g_2++)
+ { /* block id: 3 */
+ g_5 = g_2;
+ }
+ l_1545 = func_6(((func_9(func_13(l_17, (g_18 , func_19(l_23, l_23, func_24((*l_23), (0x2DC8L <= (g_18.f4 <= (safe_mod_func_int16_t_s_s(((((g_36[3] = ((safe_mul_func_int8_t_s_s((l_33 , (((*l_34) = (&g_2 == &l_17)) ^ g_2)), (*l_23))) >= (*l_23))) != 0x58L) != 0UL) , g_5), 3L)))), &g_2, g_5))), l_1108), g_1142[0][2][2], g_1142[0][1][1]) , (*l_1108)) & g_508[3][3][4].f2), l_1108);
+ (*l_1108) = ((*g_390) , ((safe_mod_func_int32_t_s_s(0xE4015B19L, ((*l_1557) |= ((safe_mul_func_int16_t_s_s((*l_1545), (*l_1545))) == ((safe_add_func_int16_t_s_s((safe_mul_func_int8_t_s_s((safe_div_func_uint16_t_u_u((*l_1108), (*l_23))), 0xE0L)), 0x3E3DL)) && 0x0202L))))) < (*l_23)));
+ for (g_240 = 0; (g_240 < (-25)); g_240 = safe_sub_func_int32_t_s_s(g_240, 6))
+ { /* block id: 1024 */
+ struct S0 **l_1561 = &g_1168;
+ (*l_1561) = l_1560;
+ }
+ return (*l_23);
+}
+
+
+/* ------------------------------------------ */
+/*
+ * reads : g_82.f4 g_628 g_499 g_2 g_1109 g_220 g_1544
+ * writes: g_82.f4 g_82.f1 g_500 g_1109 g_2 g_199
+ */
+static int32_t * func_6(int8_t p_7, int32_t * p_8)
+{ /* block id: 996 */
+ int32_t l_1514 = (-7L);
+ int32_t l_1517[10][3][7] = {{{0x6027BB7EL,0xECF50607L,0xECF50607L,0x6027BB7EL,0x6027BB7EL,0xECF50607L,0xECF50607L},{0x2C43085FL,(-1L),0x2C43085FL,(-1L),0x2C43085FL,(-1L),0x2C43085FL},{0x6027BB7EL,0x6027BB7EL,0xECF50607L,0xECF50607L,0x6027BB7EL,0x6027BB7EL,0xECF50607L}},{{0xD643F3D2L,(-1L),0xD643F3D2L,(-1L),0xD643F3D2L,(-1L),0xD643F3D2L},{0x6027BB7EL,0xECF50607L,0xECF50607L,0x6027BB7EL,0x6027BB7EL,0xECF50607L,0xECF50607L},{0x2C43085FL,(-1L),0x2C43085FL,(-1L),0x2C43085FL,(-1L),0x2C43085FL}},{{0x6027BB7EL,0x6027BB7EL,0xECF50607L,0xECF50607L,0x6027BB7EL,0x6027BB7EL,0xECF50607L},{0xD643F3D2L,(-1L),0xD643F3D2L,(-1L),0xD643F3D2L,(-1L),0xD643F3D2L},{0x6027BB7EL,0xECF50607L,0xECF50607L,0x6027BB7EL,0x6027BB7EL,0xECF50607L,0xECF50607L}},{{0x2C43085FL,(-1L),0x2C43085FL,(-1L),0x2C43085FL,(-1L),0x2C43085FL},{0x6027BB7EL,0x6027BB7EL,0xECF50607L,0xECF50607L,0x6027BB7EL,0x6027BB7EL,0xECF50607L},{0xD643F3D2L,(-1L),0xD643F3D2L,(-1L),0xD643F3D2L,(-1L),0xD643F3D2L}},{{0x6027BB7EL,0xECF50607L,0xECF50607L,0x6027BB7EL,0x6027BB7EL,0xECF50607L,0xECF50607L},{0x2C43085FL,(-1L),0x2C43085FL,(-1L),0x2C43085FL,(-1L),0x2C43085FL},{0x6027BB7EL,0x6027BB7EL,0xECF50607L,0xECF50607L,0x6027BB7EL,0x6027BB7EL,0xECF50607L}},{{0xD643F3D2L,(-1L),0xD643F3D2L,(-1L),0xD643F3D2L,(-1L),0xD643F3D2L},{0x6027BB7EL,0xECF50607L,0xECF50607L,0x6027BB7EL,0x6027BB7EL,0xECF50607L,0xECF50607L},{0x2C43085FL,(-1L),0x2C43085FL,(-1L),0x2C43085FL,(-1L),0x2C43085FL}},{{0x6027BB7EL,0x6027BB7EL,0xECF50607L,0xECF50607L,0x6027BB7EL,0x6027BB7EL,0xECF50607L},{0xD643F3D2L,(-1L),0xD643F3D2L,(-1L),0xD643F3D2L,(-1L),0xD643F3D2L},{0x6027BB7EL,0xECF50607L,0xECF50607L,0x6027BB7EL,0x6027BB7EL,0xECF50607L,0xECF50607L}},{{0x2C43085FL,(-1L),0x2C43085FL,(-1L),0x2C43085FL,(-1L),0x2C43085FL},{0x6027BB7EL,0x6027BB7EL,0xECF50607L,0xECF50607L,0x6027BB7EL,0x6027BB7EL,0xECF50607L},{0xD643F3D2L,(-1L),0xD643F3D2L,(-1L),0xD643F3D2L,(-1L),0xD643F3D2L}},{{0x6027BB7EL,0xECF50607L,0xECF50607L,0x6027BB7EL,0x6027BB7EL,0xECF50607L,0xECF50607L},{0x2C43085FL,(-1L),0x2C43085FL,(-1L),0x2C43085FL,(-1L),0x2C43085FL},{0x6027BB7EL,0x6027BB7EL,0xECF50607L,0xECF50607L,0x6027BB7EL,0x6027BB7EL,0xECF50607L}},{{0xD643F3D2L,(-1L),0xD643F3D2L,(-1L),0xD643F3D2L,(-1L),0xD643F3D2L},{0x6027BB7EL,0xECF50607L,0xECF50607L,0x6027BB7EL,0x6027BB7EL,0xECF50607L,0xECF50607L},{0x2C43085FL,(-1L),0x2C43085FL,(-1L),0x2C43085FL,(-1L),0x2C43085FL}}};
+ uint16_t *l_1521 = (void*)0;
+ int8_t *l_1522 = &g_537[0];
+ const struct S1 l_1523 = {2,-1323,441,77,102,35,-3984,6,78,0UL};
+ int32_t l_1526 = 0x2465F014L;
+ int16_t l_1533 = 0x3A98L;
+ int16_t l_1535 = (-5L);
+ int i, j, k;
+ for (g_82.f4 = 21; (g_82.f4 > 18); g_82.f4--)
+ { /* block id: 999 */
+ int8_t l_1518 = 1L;
+ int16_t l_1524 = (-3L);
+ uint32_t *l_1525 = (void*)0;
+ (*p_8) = (safe_add_func_int32_t_s_s((func_41((((l_1526 ^= ((((*p_8) = ((((l_1514 == (p_7 ^ (0xEEC6D689L == (safe_lshift_func_int8_t_s_s(((l_1517[8][1][6] |= p_7) != (l_1518 ^ ((~(l_1518 != ((((-3L) < (safe_mul_func_uint16_t_u_u(func_41(p_7, l_1521, p_7, l_1518, l_1522), (-1L)))) , l_1523) , p_7))) || 0xB339L))), l_1518))))) || 0UL) && l_1518) & 4294967295UL)) , l_1524) == 65532UL)) , p_7) , p_7), l_1521, (*g_628), p_7, &l_1518) || 4294967292UL), 1UL));
+ }
+ for (g_2 = 0; (g_2 > 27); g_2++)
+ { /* block id: 1007 */
+ int32_t *l_1529 = &l_1514;
+ int32_t *l_1530 = &g_434;
+ int32_t *l_1531 = &g_237;
+ int32_t *l_1532[7][5] = {{&g_434,&g_2,&g_434,(void*)0,(void*)0},{&g_434,&g_2,&g_434,(void*)0,(void*)0},{&g_434,&g_2,(void*)0,&l_1514,&l_1514},{(void*)0,&l_1517[4][0][6],(void*)0,&l_1514,&l_1514},{(void*)0,&l_1517[4][0][6],(void*)0,&l_1514,&l_1514},{(void*)0,&l_1517[4][0][6],(void*)0,&l_1514,&l_1514},{(void*)0,&l_1517[4][0][6],(void*)0,&l_1514,&l_1514}};
+ int8_t l_1534 = (-1L);
+ uint8_t l_1536[1][7][7] = {{{0xD3L,0UL,7UL,0UL,0UL,7UL,0UL},{0UL,255UL,0x9EL,0UL,255UL,0x1AL,0UL},{248UL,0UL,0x1AL,248UL,0UL,248UL,0x1AL},{8UL,8UL,0x0EL,0UL,0UL,255UL,8UL},{8UL,0x1AL,0x9EL,0UL,0x74L,0x74L,0UL},{248UL,0UL,248UL,0x1AL,0UL,248UL,255UL},{0UL,0UL,0xE9L,0UL,0UL,0x0EL,0UL}}};
+ int i, j, k;
+ if ((*p_8))
+ break;
+ ++l_1536[0][2][1];
+ }
+ if ((*p_8))
+ { /* block id: 1011 */
+ (*g_220) = p_8;
+ }
+ else
+ { /* block id: 1013 */
+ struct S1 *l_1539 = &g_391;
+ struct S1 **l_1540 = (void*)0;
+ struct S1 **l_1541 = &l_1539;
+ uint16_t *l_1542 = &g_82.f3;
+ int32_t l_1543 = 0x3FE0E73CL;
+ (*l_1541) = l_1539;
+ (*p_8) &= func_41(p_7, l_1542, l_1526, l_1543, g_1544[5]);
+ }
+ l_1514 = (*p_8);
+ return p_8;
+}
+
+
+/* ------------------------------------------ */
+/*
+ * reads : g_209 g_1192 g_408 g_18.f0 g_195 g_241 g_511 g_512 g_1105 g_82.f2 g_555 g_1389 g_40 g_628 g_499 g_18.f4 g_82.f1 g_1169.f1 g_508 g_220 g_1168 g_1169
+ * writes: g_209 g_1169.f3 g_1192 g_408 g_18.f0 g_195 g_241 g_82.f1 g_500 g_555 g_1389 g_40 g_601 g_18.f4 g_1169.f1 g_199 g_390
+ */
+static struct S0 func_9(int32_t * p_10, int32_t * p_11, int32_t * p_12)
+{ /* block id: 895 */
+ uint32_t l_1289 = 3UL;
+ uint8_t ** const *l_1291 = &g_254;
+ uint8_t ** const ** const l_1290 = &l_1291;
+ int32_t l_1335 = 1L;
+ int32_t l_1342 = 0x122D1585L;
+ int32_t l_1344[2];
+ uint16_t l_1391 = 0x4F32L;
+ uint32_t *l_1400[6] = {&g_391.f9,&g_391.f9,&g_391.f9,&g_391.f9,&g_391.f9,&g_391.f9};
+ int8_t l_1402 = (-1L);
+ const struct S0 *l_1417 = &g_508[3][3][4];
+ uint32_t *l_1424 = &l_1289;
+ uint32_t **l_1427 = &g_1142[0][5][2];
+ uint32_t l_1429 = 0x32A2A297L;
+ int8_t *l_1447 = &g_279;
+ int32_t l_1460 = 1L;
+ const int16_t l_1468 = 1L;
+ int32_t l_1498 = 8L;
+ int i;
+ for (i = 0; i < 2; i++)
+ l_1344[i] = 0xC9F0AD98L;
+ if ((l_1289 && (l_1290 != &l_1291)))
+ { /* block id: 896 */
+ uint8_t l_1292[1];
+ int32_t l_1327 = 0x2CA2ED02L;
+ int32_t l_1336[5][6] = {{0L,(-6L),0x2325E39FL,0xAF70E644L,0x06C4E62EL,(-1L)},{0xDD12AB3AL,0x1CD1E72DL,(-1L),0x06C4E62EL,(-1L),0x1CD1E72DL},{0xDD12AB3AL,(-1L),0x06C4E62EL,0xAF70E644L,0x2325E39FL,(-6L)},{0xDFD6990FL,(-1L),(-1L),(-6L),(-6L),(-1L)},{(-1L),(-1L),0x738CE679L,0xDFD6990FL,0x06C4E62EL,(-6L)}};
+ uint16_t *l_1360 = (void*)0;
+ uint32_t l_1368 = 0x88AF1839L;
+ int8_t *l_1382[10][3][7] = {{{&g_809[0][0][0],(void*)0,(void*)0,&g_809[4][0][6],&g_279,&g_809[0][0][0],&g_809[4][0][6]},{&g_36[0],&g_36[7],&g_537[0],&g_537[1],&g_537[2],(void*)0,(void*)0},{&g_537[2],&g_809[0][0][0],&g_1233[1],&g_809[0][0][0],&g_537[2],&g_809[0][0][0],&g_36[4]}},{{&g_1233[0],(void*)0,&g_537[1],&g_36[4],&g_279,(void*)0,&g_1233[0]},{&g_537[0],&g_1233[0],(void*)0,&g_279,&g_36[4],&g_537[1],(void*)0},{&g_1233[0],&g_36[4],&g_809[0][0][0],&g_537[2],&g_809[0][0][0],&g_1233[1],&g_809[0][0][0]}},{{&g_537[2],(void*)0,(void*)0,&g_537[2],&g_537[1],&g_537[0],&g_36[7]},{&g_36[0],&g_809[4][0][6],&g_809[0][0][0],&g_279,&g_809[4][0][6],(void*)0,(void*)0},{&g_809[0][0][0],&g_809[0][0][0],&g_1233[1],&g_36[4],&g_1233[1],&g_1233[1],&g_36[7]}},{{&g_809[0][0][0],(void*)0,&g_36[0],&g_809[0][0][0],&g_279,&g_279,&g_809[0][0][0]},{&g_36[0],&g_537[2],&g_36[0],&g_537[1],&g_809[0][0][0],&g_279,(void*)0},{&g_809[0][0][0],&g_809[0][0][0],&g_1233[1],&g_809[4][0][6],&g_36[7],&g_809[0][0][0],&g_279}},{{(void*)0,&g_809[4][0][5],(void*)0,(void*)0,(void*)0,&g_280,(void*)0},{&g_809[0][0][0],(void*)0,&g_809[4][0][5],(void*)0,&g_279,(void*)0,&g_809[4][0][5]},{(void*)0,(void*)0,&g_537[2],&g_537[1],&g_537[0],&g_36[7],&g_36[0]}},{{&g_809[0][0][0],&g_809[4][0][5],&g_36[3],&g_809[0][0][0],&g_280,&g_36[3],&g_537[1]},{&g_1233[1],&g_537[0],&g_280,(void*)0,&g_537[0],&g_809[0][0][0],&g_36[3]},{&g_36[0],&g_279,&g_36[7],&g_279,&g_279,&g_36[7],&g_279}},{{&g_36[0],&g_36[3],&g_809[0][0][0],&g_537[0],(void*)0,&g_280,&g_537[0]},{&g_1233[1],&g_537[1],&g_36[3],&g_280,&g_809[0][0][0],&g_36[3],&g_809[4][0][5]},{&g_809[0][0][0],&g_36[0],&g_36[7],&g_537[0],&g_537[1],&g_537[2],(void*)0}},{{(void*)0,&g_809[4][0][5],(void*)0,&g_279,(void*)0,&g_809[4][0][5],(void*)0},{&g_809[0][0][0],(void*)0,&g_280,(void*)0,(void*)0,(void*)0,&g_809[4][0][5]},{(void*)0,&g_279,&g_537[2],&g_809[0][0][0],&g_36[0],&g_36[7],&g_537[0]}},{{&g_537[1],&g_809[4][0][5],&g_280,&g_537[1],&g_280,&g_1233[1],&g_279},{&g_1233[1],(void*)0,(void*)0,&g_280,&g_809[0][0][0],(void*)0,&g_1233[1]},{&g_537[1],(void*)0,&g_36[4],(void*)0,&g_36[0],&g_36[4],(void*)0}},{{&g_809[0][0][0],&g_1233[1],(void*)0,&g_279,&g_280,&g_36[3],&g_279},{(void*)0,(void*)0,&g_280,&g_809[4][0][5],&g_279,&g_36[3],&g_36[3]},{&g_279,&g_809[0][0][0],&g_36[4],&g_809[0][0][0],&g_279,&g_1233[0],&g_36[0]}}};
+ int32_t l_1401 = (-9L);
+ int i, j, k;
+ for (i = 0; i < 1; i++)
+ l_1292[i] = 1UL;
+ ++l_1292[0];
+ for (g_209 = 22; (g_209 > 44); g_209 = safe_add_func_uint16_t_u_u(g_209, 7))
+ { /* block id: 900 */
+ uint8_t l_1302 = 250UL;
+ int32_t l_1322 = 0x6B975B0CL;
+ int32_t l_1343[7][3] = {{0L,0L,(-2L)},{0xB97A3A68L,0x0944A5F0L,0x2461D461L},{0L,0L,0x2461D461L},{0x0944A5F0L,0xB97A3A68L,(-2L)},{0L,0L,0L},{0L,0x0944A5F0L,0L},{0x0944A5F0L,0L,0L}};
+ int16_t l_1346[7][1][10] = {{{1L,8L,8L,1L,0x36ECL,0x3A6CL,6L,0xE8B3L,1L,1L}},{{0xE8B3L,0x691FL,6L,0x36ECL,6L,0xB5D7L,8L,6L,1L,0x3A6CL}},{{(-1L),1L,0x7EDEL,1L,0x72E8L,0x7AB0L,0x72E8L,1L,0x7EDEL,1L}},{{0L,0xB5D7L,0x3A6CL,0x3EA9L,(-10L),0x36ECL,0x3EA9L,0xE8B3L,0x29FAL,0L}},{{0x3A6CL,(-1L),0xB5D7L,0x8336L,0xB5D7L,(-7L),0xE7DBL,0x29FAL,0x1158L,0x1158L}},{{0xE8B3L,(-10L),6L,0x29FAL,0x29FAL,6L,(-10L),0xE8B3L,0x691FL,6L}},{{0x29FAL,0xE7DBL,(-7L),0xB5D7L,0x8336L,1L,0x29FAL,0x7EDEL,0x7AB0L,0x29FAL}}};
+ uint16_t *l_1358 = (void*)0;
+ int8_t *l_1390 = &g_280;
+ int32_t l_1403 = 2L;
+ int i, j, k;
+ }
+ }
+ else
+ { /* block id: 946 */
+ uint16_t *l_1425 = (void*)0;
+ uint16_t *l_1426 = &g_1169.f3;
+ int32_t l_1428 = 0x895941A3L;
+ uint16_t *l_1430 = &g_1192[0][7];
+ int32_t l_1431 = (-7L);
+ int32_t *l_1436[8][2][2] = {{{&l_1335,&l_1335},{&l_1335,&l_1431}},{{&g_39,&g_238},{&l_1431,&g_238}},{{&g_39,&l_1431},{&l_1335,&l_1335}},{{&l_1335,&l_1431},{&g_39,&g_238}},{{&l_1431,&g_238},{&g_39,&l_1431}},{{&l_1335,&l_1335},{&l_1335,&l_1431}},{{&g_39,&g_238},{&l_1431,&g_238}},{{&g_39,&l_1431},{&l_1335,&l_1335}}};
+ struct S0 l_1477 = {1UL,1L,0x5EBBL,0xA03BL,0x3FL};
+ int i, j, k;
+ (*p_12) = ((((*l_1426) = (p_11 == (l_1424 = p_11))) | (l_1427 != &g_1142[0][0][2])) > ((l_1428 , l_1429) != ((((l_1431 = ((l_1428 >= (((l_1344[1] , (((*l_1430) ^= l_1344[1]) < 0x71D3L)) <= l_1289) < 1L)) , 249UL)) | l_1344[1]) | 0x92L) , l_1344[1])));
+ (*p_11) = (safe_mod_func_int16_t_s_s(l_1431, (--(*l_1430))));
+ l_1436[7][1][0] = (((l_1428 ^ 0xAFL) & ((*p_12) && l_1431)) , &l_1431);
+ if (((*p_12) = (safe_lshift_func_int8_t_s_u((((safe_sub_func_int8_t_s_s(func_41((safe_lshift_func_uint16_t_u_s((((((&l_1417 == ((0xF7A9L > (l_1335 == (*p_11))) , (void*)0)) <= func_41((safe_mul_func_uint16_t_u_u(l_1289, l_1429)), &g_1192[0][2], (safe_mod_func_uint8_t_u_u((l_1402 && l_1335), l_1429)), l_1344[1], (*g_511))) , l_1289) > l_1402) , l_1344[1]), 14)), &g_222, l_1391, l_1335, l_1447), g_1105[8])) | l_1289) && 0L), 4))))
+ { /* block id: 956 */
+ uint32_t l_1452 = 0x19EBA21BL;
+ int32_t l_1457 = 5L;
+ uint8_t *l_1465 = &g_555[0][0];
+ const uint16_t **l_1478[2];
+ uint16_t l_1481 = 0xF23DL;
+ int i;
+ for (i = 0; i < 2; i++)
+ l_1478[i] = (void*)0;
+ (*p_12) = ((safe_add_func_int8_t_s_s((safe_add_func_int8_t_s_s(l_1452, l_1402)), (safe_mod_func_int16_t_s_s((safe_rshift_func_uint8_t_u_u((l_1457 &= g_82.f2), (((safe_lshift_func_uint8_t_u_u(l_1342, 2)) , func_41((((l_1460 || ((safe_mul_func_uint16_t_u_u(((safe_div_func_int8_t_s_s(((~(++(*l_1465))) == func_41(l_1452, l_1430, l_1452, l_1452, l_1465)), l_1452)) && l_1391), 0x642EL)) & 0x6C9408A5L)) & l_1468) == 0x97L), &l_1391, l_1335, l_1452, (*g_511))) == 3L))), l_1468)))) , (*p_12));
+ for (g_1389 = 0; (g_1389 < (-25)); g_1389--)
+ { /* block id: 962 */
+ uint16_t *l_1476 = (void*)0;
+ const int32_t l_1479[9] = {0x7870A31CL,0x7870A31CL,0x7870A31CL,0x7870A31CL,0x7870A31CL,0x7870A31CL,0x7870A31CL,0x7870A31CL,0x7870A31CL};
+ int32_t l_1480 = 0xBD654D60L;
+ int i;
+ for (g_40 = 0; (g_40 <= 2); g_40 += 1)
+ { /* block id: 965 */
+ uint16_t l_1475 = 1UL;
+ if ((*p_11))
+ break;
+ l_1480 = (safe_mod_func_int32_t_s_s((safe_rshift_func_int8_t_s_s(((((func_41(l_1475, (l_1452 , (g_601 = l_1476)), (*g_628), (&g_1142[0][1][1] == &g_1142[0][1][1]), (l_1477 , (*g_511))) > 0xEAA0L) , &g_601) == l_1478[0]) , l_1479[0]), 3)), 1UL));
+ --l_1481;
+ }
+ }
+ }
+ else
+ { /* block id: 972 */
+ int32_t l_1490 = 0xBC1D070AL;
+ int32_t l_1495 = 0x55B4B91BL;
+ int32_t l_1496 = 0L;
+ int32_t l_1497[1][1][5] = {{{5L,5L,5L,5L,5L}}};
+ uint16_t l_1506 = 0x8821L;
+ struct S1 **l_1509[2];
+ int i, j, k;
+ for (i = 0; i < 2; i++)
+ l_1509[i] = &g_390;
+ for (g_18.f4 = 0; (g_18.f4 < 54); g_18.f4 = safe_add_func_uint8_t_u_u(g_18.f4, 5))
+ { /* block id: 975 */
+ for (g_82.f1 = 6; (g_82.f1 > 20); g_82.f1 = safe_add_func_uint32_t_u_u(g_82.f1, 1))
+ { /* block id: 978 */
+ for (g_1169.f1 = (-2); (g_1169.f1 != (-22)); g_1169.f1 = safe_sub_func_uint16_t_u_u(g_1169.f1, 3))
+ { /* block id: 981 */
+ return (*l_1417);
+ }
+ }
+ }
+ if ((l_1490 ^ (safe_div_func_uint16_t_u_u(l_1342, l_1490))))
+ { /* block id: 986 */
+ (*p_12) = (*p_12);
+ }
+ else
+ { /* block id: 988 */
+ int32_t l_1493[3][3] = {{(-4L),(-4L),(-1L)},{(-4L),(-4L),(-1L)},{(-4L),(-4L),(-1L)}};
+ int32_t l_1494 = 0xF56B557AL;
+ int32_t l_1499 = 0L;
+ int32_t l_1500 = 0x64A61DCEL;
+ int32_t l_1501 = 0x18BA8B7FL;
+ int32_t l_1502 = 0xFD7B4B2BL;
+ int32_t l_1503 = 0x1CDE3638L;
+ int32_t l_1504 = 1L;
+ int32_t l_1505 = (-1L);
+ int i, j;
+ ++l_1506;
+ }
+ (*g_220) = p_12;
+ g_390 = &g_391;
+ }
+ }
+ return (*g_1168);
+}
+
+
+/* ------------------------------------------ */
+/*
+ * reads : g_2 g_1109 g_82 g_802 g_220 g_390 g_391 g_18 g_542 g_555 g_119 g_1105 g_199 g_279 g_501 g_499 g_5 g_1192 g_251
+ * writes: g_1109 g_18.f0 g_2 g_802 g_1113.f9 g_1141 g_279 g_199 g_82.f4 g_82.f0 g_542 g_555 g_119 g_1105 g_390 g_501 g_1168 g_5 g_251 g_82.f3
+ */
+static int32_t * func_13(const int16_t p_14, int32_t * p_15, int32_t * p_16)
+{ /* block id: 748 */
+ uint32_t l_1116[9][10] = {{0x90628E09L,0xB05BB543L,0xB05BB543L,0x90628E09L,6UL,0x7AA97B2BL,0x2750F53DL,0UL,0x5A6596A4L,0UL},{0xB05BB543L,4294967294UL,0x0D9C2F16L,0x0D9C2F16L,6UL,0xCA63206FL,0x2ADE30DFL,4294967294UL,0UL,0x90628E09L},{4294967294UL,0xB05BB543L,0x2750F53DL,0x5A6596A4L,0x2ADE30DFL,0x2ADE30DFL,0x5A6596A4L,0x2750F53DL,0xB05BB543L,4294967294UL},{0x71DF7270L,0xB05BB543L,0UL,4294967293UL,0x0D9C2F16L,0x90628E09L,0x2ADE30DFL,0x90628E09L,0x0D9C2F16L,4294967293UL},{4294967293UL,0xCA63206FL,4294967293UL,0xB05BB543L,0x0D9C2F16L,0x7AA97B2BL,4294967294UL,6UL,6UL,4294967294UL},{0x0D9C2F16L,0x2ADE30DFL,0x7AA97B2BL,0x7AA97B2BL,0x2ADE30DFL,0x0D9C2F16L,0x71DF7270L,6UL,0x5A6596A4L,0x90628E09L},{0xCA63206FL,0x90628E09L,4294967293UL,0x2750F53DL,6UL,0x2750F53DL,4294967293UL,0x90628E09L,0xCA63206FL,0x0D9C2F16L},{0xCA63206FL,0x7AA97B2BL,0UL,0x71DF7270L,0x2750F53DL,0x0D9C2F16L,0x0D9C2F16L,0x2750F53DL,0x71DF7270L,0UL},{0x0D9C2F16L,0x0D9C2F16L,0x2750F53DL,0x71DF7270L,0UL,0x7AA97B2BL,0xCA63206FL,4294967294UL,0xCA63206FL,0x7AA97B2BL}};
+ int8_t *l_1119 = &g_537[0];
+ int32_t l_1122 = (-1L);
+ int32_t l_1126 = (-1L);
+ struct S1 **l_1130 = &g_390;
+ struct S1 ***l_1129 = &l_1130;
+ int32_t l_1178 = 0x6946CE07L;
+ int32_t l_1180[2];
+ int8_t l_1196[3][10][5] = {{{(-5L),(-1L),0xEDL,(-1L),(-5L)},{0L,4L,0x17L,0xFCL,0x93L},{0x89L,0x46L,0x5DL,(-1L),(-1L)},{0xFCL,1L,0xFCL,(-1L),0xE8L},{5L,(-1L),0xEDL,0x5DL,0x89L},{0xE8L,0x89L,4L,4L,0x89L},{0x43L,9L,0xEDL,0x89L,0x46L},{0xFCL,0xF4L,0L,0xBFL,0xC4L},{0x0FL,0x43L,0x43L,0x0FL,0L},{0xFCL,4L,0x93L,0x42L,0xBFL}},{{0x43L,(-5L),(-1L),0xEDL,(-1L)},{0xE8L,0xE8L,0xBFL,0x42L,0x93L},{5L,0x5DL,0L,0x0FL,0x43L},{0L,0xBFL,0xC4L,0xBFL,0L},{(-1L),0x5DL,0x46L,0x89L,0xEDL},{0x42L,0xE8L,0x89L,4L,4L},{0x89L,(-5L),0x89L,0x5DL,0xEDL},{1L,4L,0xE8L,(-1L),0L},{0xEDL,0x43L,(-1L),(-1L),0x43L},{0x89L,0xF4L,0xE8L,0L,0x93L}},{{(-5L),9L,0x89L,0L,(-1L)},{0x17L,0x89L,0x89L,0x17L,0xBFL},{(-5L),(-1L),0x46L,(-1L),5L},{0xF4L,0L,0xBFL,0xC4L,0xBFL},{(-1L),(-1L),5L,(-1L),0xEDL},{0xFCL,0x89L,1L,0x93L,0xF4L},{(-1L),5L,0L,5L,(-1L)},{4L,0x89L,0xE8L,0x42L,0xC4L},{(-1L),(-1L),9L,0x5DL,0x5DL},{0x42L,0L,0x42L,0x89L,0xC4L}}};
+ int8_t l_1197 = (-1L);
+ uint32_t *l_1205 = &g_251;
+ uint8_t *l_1210 = &g_119;
+ int16_t *l_1215[2][10][4] = {{{&g_18.f1,&g_18.f1,&g_18.f1,(void*)0},{&g_18.f1,(void*)0,(void*)0,&g_18.f1},{&g_1052,(void*)0,(void*)0,(void*)0},{&g_18.f1,&g_18.f1,&g_18.f1,&g_18.f1},{&g_18.f1,(void*)0,&g_1052,&g_18.f1},{&g_1052,&g_18.f1,(void*)0,(void*)0},{(void*)0,(void*)0,&g_18.f1,&g_18.f1},{(void*)0,(void*)0,(void*)0,(void*)0},{&g_1052,&g_18.f1,&g_1052,(void*)0},{&g_18.f1,&g_18.f1,&g_18.f1,(void*)0}},{{&g_18.f1,(void*)0,(void*)0,&g_18.f1},{&g_1052,(void*)0,(void*)0,(void*)0},{&g_18.f1,&g_18.f1,&g_18.f1,&g_18.f1},{&g_18.f1,(void*)0,&g_1052,&g_18.f1},{&g_1052,&g_18.f1,(void*)0,&g_18.f1},{(void*)0,(void*)0,&g_18.f1,(void*)0},{(void*)0,&g_508[3][3][4].f1,&g_18.f1,(void*)0},{&g_18.f1,(void*)0,&g_18.f1,&g_18.f1},{&g_1052,(void*)0,&g_18.f1,(void*)0},{(void*)0,&g_508[3][3][4].f1,&g_508[3][3][4].f1,(void*)0}}};
+ int16_t l_1216 = (-4L);
+ int32_t l_1250 = (-5L);
+ int8_t l_1260 = (-10L);
+ int32_t l_1261 = 5L;
+ int32_t *l_1280[8][10] = {{&g_39,&g_39,&l_1126,&g_238,(void*)0,&g_39,&g_876,&l_1126,(void*)0,(void*)0},{&g_39,&g_876,&l_1126,(void*)0,(void*)0,&g_876,&g_876,(void*)0,(void*)0,&l_1126},{&g_39,&g_39,&l_1126,&g_238,(void*)0,&g_39,&g_876,&l_1126,(void*)0,(void*)0},{&g_39,&g_876,&l_1126,(void*)0,(void*)0,&g_876,&g_876,(void*)0,(void*)0,&l_1126},{&g_39,&g_39,&l_1126,&g_238,(void*)0,&g_39,&g_876,&l_1126,(void*)0,(void*)0},{&g_39,&g_876,&l_1126,(void*)0,(void*)0,&g_876,&g_876,(void*)0,(void*)0,&l_1126},{&g_39,&g_39,&l_1126,&g_238,(void*)0,&g_39,&g_876,&l_1126,(void*)0,(void*)0},{&g_39,&g_876,&l_1126,(void*)0,(void*)0,(void*)0,(void*)0,(void*)0,&g_39,&g_238}};
+ struct S0 **l_1283 = &g_1168;
+ int32_t *l_1287 = (void*)0;
+ int32_t *l_1288 = &l_1178;
+ int i, j, k;
+ for (i = 0; i < 2; i++)
+ l_1180[i] = 0x8AE8E413L;
+ if ((*p_15))
+ { /* block id: 749 */
+ struct S1 *l_1110 = &g_391;
+ struct S1 **l_1111[8][5][5] = {{{&l_1110,(void*)0,&g_390,&g_390,&g_390},{&l_1110,&l_1110,&l_1110,&l_1110,&l_1110},{&l_1110,&g_390,&g_390,&l_1110,&g_390},{&l_1110,&g_390,&g_390,&g_390,&g_390},{&l_1110,&g_390,&l_1110,&l_1110,&g_390}},{{(void*)0,&l_1110,&g_390,&l_1110,&l_1110},{&g_390,(void*)0,&g_390,&l_1110,&g_390},{&g_390,&g_390,&l_1110,&g_390,&g_390},{&l_1110,&l_1110,&g_390,&l_1110,&l_1110},{&l_1110,&g_390,&g_390,&l_1110,&g_390}},{{&g_390,&l_1110,&l_1110,&g_390,&g_390},{(void*)0,&g_390,&g_390,&l_1110,&g_390},{&g_390,(void*)0,&g_390,&g_390,&g_390},{&l_1110,&l_1110,&l_1110,&l_1110,&g_390},{&l_1110,&g_390,&g_390,&l_1110,&g_390}},{{&g_390,&g_390,&g_390,&l_1110,&g_390},{&g_390,&g_390,&l_1110,&g_390,&l_1110},{(void*)0,&l_1110,&g_390,&l_1110,&g_390},{&l_1110,(void*)0,&l_1110,&l_1110,&g_390},{&l_1110,(void*)0,&l_1110,&g_390,&l_1110}},{{(void*)0,&l_1110,&l_1110,(void*)0,(void*)0},{&l_1110,&l_1110,&g_390,&g_390,&l_1110},{&l_1110,&g_390,&g_390,&l_1110,(void*)0},{(void*)0,&l_1110,(void*)0,(void*)0,&l_1110},{&l_1110,(void*)0,&g_390,&l_1110,&g_390}},{{&l_1110,&l_1110,&l_1110,&g_390,(void*)0},{(void*)0,&l_1110,&g_390,(void*)0,&l_1110},{(void*)0,&l_1110,(void*)0,&g_390,&l_1110},{&g_390,&l_1110,&g_390,&l_1110,&l_1110},{(void*)0,&l_1110,&g_390,(void*)0,&g_390}},{{&g_390,(void*)0,&l_1110,&l_1110,&g_390},{(void*)0,&l_1110,&l_1110,&l_1110,&g_390},{(void*)0,&g_390,&l_1110,(void*)0,&l_1110},{&l_1110,&l_1110,&l_1110,&l_1110,&l_1110},{&l_1110,&l_1110,&g_390,&l_1110,&l_1110}},{{(void*)0,(void*)0,&l_1110,(void*)0,(void*)0},{&l_1110,(void*)0,&l_1110,&l_1110,&g_390},{&g_390,&g_390,(void*)0,&l_1110,&l_1110},{&l_1110,&g_390,(void*)0,(void*)0,&l_1110},{&g_390,&l_1110,&l_1110,&l_1110,&l_1110}}};
+ struct S1 *l_1112 = &g_1113;
+ uint8_t ***l_1118[9][9] = {{(void*)0,&g_254,(void*)0,&g_254,&g_254,(void*)0,&g_254,(void*)0,&g_254},{&g_254,(void*)0,(void*)0,&g_254,&g_254,(void*)0,&g_254,&g_254,&g_254},{&g_254,&g_254,(void*)0,&g_254,&g_254,(void*)0,(void*)0,&g_254,&g_254},{(void*)0,&g_254,(void*)0,&g_254,&g_254,(void*)0,&g_254,(void*)0,&g_254},{&g_254,(void*)0,(void*)0,&g_254,&g_254,(void*)0,&g_254,&g_254,&g_254},{&g_254,&g_254,(void*)0,&g_254,&g_254,(void*)0,(void*)0,&g_254,&g_254},{(void*)0,&g_254,(void*)0,&g_254,&g_254,(void*)0,&g_254,(void*)0,&g_254},{&g_254,(void*)0,(void*)0,&g_254,&g_254,(void*)0,&g_254,&g_254,&g_254},{&g_254,&g_254,(void*)0,&g_254,&g_254,(void*)0,(void*)0,&g_254,&g_254}};
+ uint8_t ****l_1117 = &l_1118[0][8];
+ const int8_t *l_1120 = &g_279;
+ int16_t *l_1121[8][2] = {{(void*)0,&g_82.f1},{&g_1052,&g_82.f1},{(void*)0,&g_82.f1},{&g_1052,&g_82.f1},{(void*)0,&g_82.f1},{&g_1052,&g_82.f1},{(void*)0,&g_82.f1},{&g_1052,&g_82.f1}};
+ uint32_t *l_1123 = &g_18.f0;
+ int32_t l_1124 = 0xEDBDFF21L;
+ uint32_t l_1125 = 0UL;
+ int32_t l_1181 = 0L;
+ int32_t l_1183 = 0xF8FD7B68L;
+ int i, j, k;
+ l_1112 = l_1110;
+ (*p_16) ^= 0x92C5D770L;
+ if ((safe_add_func_int32_t_s_s(((l_1116[4][0] = 0UL) , (((l_1126 &= ((((((*l_1123) = (((((&g_254 != ((*l_1117) = &g_254)) , l_1119) == l_1119) , (l_1122 ^= l_1116[1][6])) ^ 0xEF73L)) , (-9L)) <= l_1124) && 0xDAL) , l_1125)) <= 0x1610ADAAL) && 65535UL)), p_14)))
+ { /* block id: 757 */
+lbl_1158:
+ (*p_15) = (0x3E96A966L < (*p_16));
+ }
+ else
+ { /* block id: 759 */
+ struct S1 ****l_1131 = &l_1129;
+ int32_t l_1147 = 0xF6AFA3B1L;
+ int32_t l_1150 = 0xA4754866L;
+ int32_t l_1177 = 0L;
+ int32_t l_1179 = (-4L);
+ int32_t l_1182[9] = {1L,1L,1L,1L,1L,1L,1L,1L,1L};
+ int16_t l_1185 = 0x36BEL;
+ int i;
+ if ((safe_lshift_func_int8_t_s_s(p_14, (((*l_1131) = l_1129) == (g_82 , &l_1130)))))
+ { /* block id: 761 */
+ uint32_t l_1135 = 0xD5BBD21CL;
+ for (g_1109 = 15; (g_1109 > (-10)); g_1109--)
+ { /* block id: 764 */
+ int32_t *l_1134[1][3];
+ int i, j;
+ for (i = 0; i < 1; i++)
+ {
+ for (j = 0; j < 3; j++)
+ l_1134[i][j] = &l_1124;
+ }
+ for (g_2 = 0; (g_2 <= 0); g_2 += 1)
+ { /* block id: 767 */
+ return p_16;
+ }
+ l_1135--;
+ }
+ for (g_802 = 2; (g_802 <= 8); g_802 += 1)
+ { /* block id: 774 */
+ for (g_1113.f9 = 0; (g_1113.f9 <= 2); g_1113.f9 += 1)
+ { /* block id: 777 */
+ uint32_t ***l_1138 = (void*)0;
+ uint32_t **l_1140 = (void*)0;
+ uint32_t ***l_1139[7];
+ int i;
+ for (i = 0; i < 7; i++)
+ l_1139[i] = &l_1140;
+ g_1141 = &l_1123;
+ }
+ for (g_279 = 0; (g_279 <= 8); g_279 += 1)
+ { /* block id: 782 */
+ (*g_220) = p_16;
+ }
+ }
+ for (g_82.f4 = 0; (g_82.f4 == 25); g_82.f4++)
+ { /* block id: 788 */
+ for (g_82.f0 = 0; (g_82.f0 <= 0); g_82.f0 += 1)
+ { /* block id: 791 */
+ int i;
+ (*g_220) = func_19(p_15, p_15, (*g_390));
+ (*g_220) = func_19((*g_220), p_16, (*g_390));
+ }
+ }
+ }
+ else
+ { /* block id: 796 */
+ uint32_t **l_1145 = &l_1123;
+ int32_t l_1146 = (-6L);
+ int8_t *l_1163[3][5] = {{&g_809[0][0][0],&g_36[3],&g_809[0][0][0],&g_809[0][0][0],&g_36[0]},{&g_279,&g_537[0],&g_36[0],&g_537[0],&g_279},{&g_809[0][0][0],&g_537[0],&g_36[3],&g_279,&g_36[3]}};
+ int32_t l_1176[3][1];
+ int i, j;
+ for (i = 0; i < 3; i++)
+ {
+ for (j = 0; j < 1; j++)
+ l_1176[i][j] = 0x96B5594EL;
+ }
+ (**l_1129) = (**l_1129);
+ for (g_279 = 8; (g_279 >= 3); g_279 -= 1)
+ { /* block id: 800 */
+ uint8_t l_1155 = 255UL;
+ (*p_16) = (((void*)0 != l_1145) | l_1146);
+ for (g_501 = 0; (g_501 <= 2); g_501 += 1)
+ { /* block id: 804 */
+ int32_t *l_1148 = &g_1109;
+ int32_t *l_1149 = &g_433;
+ int32_t *l_1151 = &g_500;
+ int32_t *l_1152 = &g_238;
+ int32_t *l_1153 = &g_434;
+ int32_t *l_1154[9] = {(void*)0,(void*)0,(void*)0,(void*)0,(void*)0,(void*)0,(void*)0,(void*)0,(void*)0};
+ int i;
+ (*p_16) &= (*p_15);
+ if (l_1147)
+ break;
+ --l_1155;
+ }
+ }
+ for (g_18.f0 = 0; (g_18.f0 <= 0); g_18.f0 += 1)
+ { /* block id: 812 */
+ int32_t *l_1171 = &l_1146;
+ int32_t *l_1172 = &g_434;
+ int32_t *l_1173 = (void*)0;
+ int32_t *l_1174 = (void*)0;
+ int32_t *l_1175[9][1][2] = {{{&l_1124,&g_238}},{{&l_1147,&g_238}},{{&l_1124,&g_39}},{{&g_39,&l_1124}},{{&g_238,&l_1147}},{{&g_238,&l_1124}},{{&g_39,&g_39}},{{&l_1124,&g_238}},{{&l_1147,&g_238}}};
+ int32_t l_1184 = 0xC96082DDL;
+ uint32_t l_1186[10][9][2] = {{{0x6E9628BBL,18446744073709551615UL},{18446744073709551615UL,0x2C2C3B62L},{18446744073709551608UL,4UL},{2UL,18446744073709551612UL},{0x2C2C3B62L,0x2C2C3B62L},{0UL,1UL},{0x6E9628BBL,18446744073709551607UL},{0x886E6C5AL,0xFCF6436BL},{18446744073709551612UL,0x886E6C5AL}},{{18446744073709551613UL,18446744073709551609UL},{18446744073709551613UL,0x886E6C5AL},{18446744073709551612UL,0xFCF6436BL},{0x886E6C5AL,18446744073709551607UL},{0x6E9628BBL,1UL},{18446744073709551607UL,18446744073709551615UL},{18446744073709551615UL,0x02BC55E2L},{18446744073709551606UL,0xFCF6436BL},{0xFFBA7176L,18446744073709551615UL}},{{0x8232C893L,18446744073709551612UL},{0x886E6C5AL,1UL},{1UL,2UL},{0xFCF6436BL,1UL},{18446744073709551615UL,0x6E9628BBL},{0UL,18446744073709551613UL},{0xFCF6436BL,4UL},{18446744073709551613UL,1UL},{18446744073709551606UL,4UL}},{{0x8232C893L,0xFFBA7176L},{18446744073709551615UL,0xFCF6436BL},{0xDCED0008L,0xFCF6436BL},{18446744073709551615UL,0xFFBA7176L},{0x8232C893L,4UL},{18446744073709551606UL,1UL},{18446744073709551613UL,4UL},{0xFCF6436BL,18446744073709551613UL},{0UL,0x6E9628BBL}},{{18446744073709551615UL,1UL},{0xFCF6436BL,2UL},{1UL,1UL},{0x886E6C5AL,18446744073709551612UL},{0x8232C893L,18446744073709551615UL},{0xFFBA7176L,0xFCF6436BL},{18446744073709551606UL,0x02BC55E2L},{18446744073709551615UL,18446744073709551615UL},{18446744073709551607UL,4UL}},{{0x886E6C5AL,18446744073709551615UL},{18446744073709551613UL,2UL},{0x02BC55E2L,18446744073709551613UL},{18446744073709551615UL,0xB081ED74L},{18446744073709551615UL,18446744073709551613UL},{0x02BC55E2L,2UL},{18446744073709551613UL,18446744073709551615UL},{0x886E6C5AL,4UL},{18446744073709551607UL,18446744073709551615UL}},{{18446744073709551615UL,0x02BC55E2L},{18446744073709551606UL,0xFCF6436BL},{0xFFBA7176L,18446744073709551615UL},{0x8232C893L,18446744073709551612UL},{0x886E6C5AL,1UL},{1UL,2UL},{0xFCF6436BL,1UL},{18446744073709551615UL,18446744073709551606UL},{0xFA7C8EF7L,0UL}},{{4UL,1UL},{0UL,18446744073709551612UL},{18446744073709551608UL,0x02BC55E2L},{18446744073709551615UL,0x9A98F82CL},{18446744073709551609UL,4UL},{18446744073709551609UL,4UL},{18446744073709551609UL,0x9A98F82CL},{18446744073709551615UL,0x02BC55E2L},{18446744073709551608UL,18446744073709551612UL}},{{0UL,1UL},{4UL,0UL},{0xFA7C8EF7L,18446744073709551606UL},{18446744073709551607UL,3UL},{4UL,0xDCED0008L},{3UL,18446744073709551612UL},{1UL,0xA6DAAE01L},{18446744073709551615UL,18446744073709551609UL},{0x9A98F82CL,4UL}},{{18446744073709551608UL,0x6D14230FL},{18446744073709551609UL,18446744073709551609UL},{0x4F5E8A69L,0x02BC55E2L},{1UL,5UL},{0UL,0xDCED0008L},{0x6D14230FL,0UL},{18446744073709551607UL,3UL},{18446744073709551607UL,0UL},{0x6D14230FL,0xDCED0008L}}};
+ int i, j, k;
+ if ((*p_15))
+ break;
+ if (g_391.f5)
+ goto lbl_1158;
+ for (g_2 = 0; (g_2 <= 0); g_2 += 1)
+ { /* block id: 817 */
+ struct S0 *l_1170[8] = {&g_508[3][3][4],&g_508[3][3][4],&g_508[3][3][4],&g_508[3][3][4],&g_508[3][3][4],&g_508[3][3][4],&g_508[3][3][4],&g_508[3][3][4]};
+ int i, j;
+ (*p_16) &= (safe_sub_func_uint32_t_u_u(g_499[g_18.f0][g_2], (l_1116[(g_18.f0 + 6)][(g_2 + 6)] , ((p_14 > (l_1120 != l_1163[2][4])) & (safe_sub_func_uint32_t_u_u((safe_div_func_int32_t_s_s(0x03DEC767L, p_14)), (((g_1168 = &g_508[3][3][4]) != l_1170[4]) , 0x42A71327L)))))));
+ (*p_16) = (p_14 < 0L);
+ }
+ l_1186[1][3][0]++;
+ for (g_5 = 0; (g_5 <= 0); g_5 += 1)
+ { /* block id: 825 */
+ uint16_t l_1189[4] = {0xF7CAL,0xF7CAL,0xF7CAL,0xF7CAL};
+ int i;
+ --l_1189[3];
+ }
+ }
+ (*p_15) ^= (((*p_16) = l_1178) , g_1192[0][6]);
+ }
+ }
+ }
+ else
+ { /* block id: 833 */
+ int32_t *l_1193 = (void*)0;
+ int32_t *l_1194 = &g_876;
+ int32_t *l_1195[10][4] = {{&g_237,&l_1180[0],&l_1180[0],&l_1180[0]},{&g_237,&l_1180[0],&g_237,&g_238},{&l_1180[0],&l_1180[0],&g_238,&g_238},{&l_1180[0],&l_1180[0],&l_1178,&l_1180[0]},{&l_1180[0],&l_1180[0],&l_1178,&l_1180[0]},{&l_1180[0],&g_237,&g_238,&l_1178},{&l_1180[0],&g_237,&g_237,&g_238},{&l_1180[0],&g_238,&l_1178,&g_237},{&l_1180[0],&l_1178,&l_1180[0],&l_1180[0]},{&g_238,&g_237,&l_1180[0],&l_1180[0]}};
+ uint8_t l_1198 = 0UL;
+ int i, j;
+ l_1198++;
+ }
+ (*p_15) ^= (safe_lshift_func_int16_t_s_s((safe_div_func_uint32_t_u_u(((*l_1205)++), l_1196[2][6][1])), (l_1180[0] = (((+(safe_lshift_func_uint8_t_u_u(((*l_1210)++), ((safe_lshift_func_int16_t_s_s(l_1116[4][0], 6)) , 1UL)))) == 1L) , p_14))));
+ if (l_1216)
+ { /* block id: 840 */
+ return p_15;
+ }
+ else
+ { /* block id: 842 */
+ uint16_t l_1221[2][9][6] = {{{1UL,0xA6E1L,8UL,65535UL,1UL,0UL},{0UL,65535UL,0UL,1UL,1UL,0UL},{0xA6E1L,0xA6E1L,0xB9C0L,8UL,1UL,0UL},{0xA6E1L,8UL,65535UL,1UL,0UL,0xB9C0L},{0UL,0xA6E1L,65535UL,65535UL,0xA6E1L,0UL},{1UL,65535UL,0xB9C0L,1UL,0xA6E1L,0UL},{1UL,0xA6E1L,0UL,8UL,0UL,0UL},{1UL,8UL,8UL,1UL,1UL,0xB9C0L},{1UL,0xA6E1L,8UL,65535UL,1UL,0UL}},{{0UL,65535UL,0UL,1UL,1UL,0UL},{0xA6E1L,0xA6E1L,0xB9C0L,8UL,1UL,0UL},{0xA6E1L,8UL,65535UL,1UL,0UL,0xB9C0L},{0UL,0xA6E1L,65535UL,65535UL,0xA6E1L,0UL},{1UL,65535UL,0xB9C0L,1UL,0xA6E1L,0UL},{1UL,0xA6E1L,0UL,8UL,0UL,0UL},{1UL,8UL,8UL,1UL,1UL,0xB9C0L},{1UL,0xA6E1L,8UL,65535UL,1UL,0UL},{0UL,65535UL,0UL,1UL,1UL,0UL}}};
+ int32_t *l_1234 = (void*)0;
+ int32_t l_1237 = 0xDB5C3602L;
+ int32_t l_1242 = 0L;
+ int32_t l_1247 = 0xF2CC364AL;
+ int32_t l_1249 = 0xF1E7180FL;
+ int32_t l_1251 = 0xA149DBF1L;
+ int32_t l_1252 = 0xFBB6885AL;
+ int32_t l_1253[5][9][5] = {{{0L,0x84665002L,2L,(-7L),0xBD32F491L},{0xA6FBD2E6L,0L,0xC28A2745L,0xBD32F491L,(-10L)},{(-1L),0L,3L,0L,0L},{0L,0x0ACB57C3L,1L,0xBB327930L,(-9L)},{0xD71E7DEDL,0xA08123F0L,5L,0L,0L},{0x267D6E1AL,0x32F668E8L,0x3E8D01CAL,0xA6FBD2E6L,0x32F668E8L},{(-3L),0x32F668E8L,2L,0L,0xA7E3B020L},{7L,0xA08123F0L,0L,0xF657A079L,0x51757FC2L},{0x98382590L,0x0ACB57C3L,0L,0xD71E7DEDL,0x09C94484L}},{{1L,0L,0xBB327930L,0xF602B128L,0L},{(-9L),0L,0L,(-9L),2L},{0x267D6E1AL,0x84665002L,0x16EEF47BL,7L,0x09C94484L},{(-8L),7L,(-10L),5L,9L},{0xF657A079L,0L,0xA08123F0L,7L,1L},{0L,0x84665002L,0xEDF5817DL,0L,0x267D6E1AL},{0xA08123F0L,0x83309CD8L,0xF602B128L,0L,(-1L)},{(-1L),(-3L),(-10L),0xA7E3B020L,2L},{0xD71E7DEDL,0xA6FBD2E6L,(-6L),0xBD32F491L,(-1L)}},{{0xBB327930L,(-9L),0x770F047CL,1L,0L},{0x09C94484L,0xA08123F0L,(-7L),0x83309CD8L,1L},{0x09C94484L,0x84665002L,0x78A1D5A5L,(-1L),0x83309CD8L},{0xBB327930L,(-1L),0xAED3E08DL,(-8L),0xBD32F491L},{0xD71E7DEDL,0xAED3E08DL,0L,0x84665002L,0xA08123F0L},{(-1L),0xD71E7DEDL,0xAAF60F01L,0x09C94484L,0x09C94484L},{0xA08123F0L,0xBD32F491L,0xA08123F0L,1L,0L},{0L,0x770F047CL,(-3L),0x84665002L,1L},{0xBD32F491L,0L,0x3E8D01CAL,0xD71E7DEDL,0L}},{{0x32DA8A12L,0x0ACB57C3L,(-3L),1L,(-1L)},{(-1L),0xF602B128L,0xA08123F0L,0x83309CD8L,0xF602B128L},{0L,0x267D6E1AL,0xAAF60F01L,0L,7L},{0xAED3E08DL,0x0ACB57C3L,0L,(-7L),0L},{(-9L),0L,0xAED3E08DL,0xA7E3B020L,0x51757FC2L},{0x32F668E8L,(-10L),0x78A1D5A5L,(-1L),0x84665002L},{(-5L),0L,0x074F165CL,(-5L),0L},{0xC28A2745L,0xBFC76879L,(-1L),0L,0xD0F8360AL},{1L,0L,0x32F668E8L,1L,2L}},{{0x074F165CL,0xF602B128L,0L,0L,0x51757FC2L},{0xA08123F0L,7L,0x1C985263L,0x770F047CL,0x1C985263L},{0x32DA8A12L,0x32DA8A12L,(-1L),0xC28A2745L,0xF602B128L},{0xAAF60F01L,1L,0L,1L,0x770F047CL},{(-7L),0x78A1D5A5L,(-10L),0L,0xAAF60F01L},{0L,1L,0x0ACB57C3L,0xA08123F0L,0xAED3E08DL},{3L,0x32DA8A12L,0x074F165CL,0x748F8E4EL,5L},{5L,7L,0xBFC76879L,0xBB327930L,0x748F8E4EL},{0L,0xF602B128L,0L,(-7L),0L}}};
+ int8_t *l_1284 = &g_809[1][0][5];
+ int i, j, k;
+ (*p_16) = (!(safe_sub_func_int32_t_s_s((safe_mod_func_uint16_t_u_u((l_1180[1] |= p_14), 1L)), ((l_1196[2][4][3] < (-1L)) >= (&g_365 != ((++l_1221[0][4][4]) , &g_365))))));
+lbl_1285:
+ for (g_82.f3 = (-28); (g_82.f3 == 18); g_82.f3 = safe_add_func_int8_t_s_s(g_82.f3, 3))
+ { /* block id: 848 */
+ int16_t l_1235 = (-2L);
+ int32_t l_1238 = 1L;
+ int8_t l_1239 = 0x39L;
+ int32_t l_1241[3][10][2] = {{{0x0F2A4A28L,0L},{0xE6C9B04AL,1L},{0xD502F28DL,(-1L)},{0L,0x674EC8C3L},{0x674EC8C3L,0x674EC8C3L},{0L,(-1L)},{0xD502F28DL,1L},{0xE6C9B04AL,0L},{0x0F2A4A28L,0xE6C9B04AL},{0x9CBF4857L,0xC8A66176L}},{{0x9CBF4857L,0xE6C9B04AL},{0x0F2A4A28L,0L},{0xE6C9B04AL,1L},{0xD502F28DL,(-1L)},{0L,0x674EC8C3L},{0x674EC8C3L,0x674EC8C3L},{0L,(-1L)},{0xD502F28DL,0x9CBF4857L},{1L,0xE6C9B04AL},{(-1L),1L}},{{0x674EC8C3L,0x0F2A4A28L},{0x674EC8C3L,1L},{(-1L),0xE6C9B04AL},{1L,0x9CBF4857L},{0L,0x1D6C64F6L},{0xE6C9B04AL,0xC8A66176L},{0xC8A66176L,0xC8A66176L},{0xE6C9B04AL,0x1D6C64F6L},{0L,0x9CBF4857L},{1L,0xE6C9B04AL}}};
+ int32_t l_1259 = 0x4D187B5CL;
+ int32_t l_1262 = 0x2EE8D66DL;
+ struct S1 l_1266 = {2,2376,563,217,1949,19,665,112,9,0x0FC184AEL};
+ int i, j, k;
+ }
+ if ((safe_unary_minus_func_uint32_t_u((p_14 != p_14))))
+ { /* block id: 885 */
+ int32_t *l_1286 = &l_1247;
+ if (g_391.f3)
+ goto lbl_1285;
+ return p_16;
+ }
+ else
+ { /* block id: 888 */
+ (*p_15) = (~((*p_16) = 0L));
+ }
+ }
+ (*g_220) = l_1287;
+ return (*g_220);
+}
+
+
+/* ------------------------------------------ */
+/*
+ * reads : g_18 g_542 g_555 g_119 g_1105
+ * writes: g_2 g_542 g_555 g_119 g_1105 g_1109
+ */
+static int32_t * func_19(int32_t * p_20, int32_t * p_21, struct S1 p_22)
+{ /* block id: 736 */
+ uint16_t l_1090 = 1UL;
+ struct S0 l_1091 = {0UL,-9L,65535UL,0xE985L,0xC8L};
+ uint32_t *l_1092 = &g_542;
+ uint32_t *l_1093[1];
+ int32_t l_1094 = 0x39EBFE2DL;
+ uint16_t **l_1095 = &g_601;
+ int32_t l_1096 = 0x616926E9L;
+ uint8_t *l_1097 = &g_555[0][0];
+ uint8_t *l_1100 = &g_119;
+ int32_t *l_1101[9][2] = {{(void*)0,&g_433},{&g_434,&g_434},{&g_434,&g_433},{(void*)0,&g_238},{&g_433,&g_238},{(void*)0,&g_433},{&g_434,&g_434},{&g_434,&g_433},{(void*)0,&g_238}};
+ uint8_t l_1102[1];
+ int i, j;
+ for (i = 0; i < 1; i++)
+ l_1093[i] = &g_347;
+ for (i = 0; i < 1; i++)
+ l_1102[i] = 255UL;
+ (*p_20) = (safe_rshift_func_int8_t_s_s(((safe_add_func_uint16_t_u_u(p_22.f0, l_1090)) , p_22.f5), 4));
+ (*p_20) = ((l_1091.f1 , p_22.f6) ^ ((*l_1100) ^= (((g_18 , ((p_22.f7 |= (l_1094 = ((*l_1092) &= l_1091.f4))) & ((l_1096 = (l_1095 == l_1095)) && (++(*l_1097))))) || 7UL) != 0xF44BF0BDL)));
+ l_1102[0]--;
+ g_1105[8]--;
+ return p_20;
+}
+
+
+/* ------------------------------------------ */
+/*
+ * reads : g_18.f1 g_2 g_39 g_40 g_18.f3 g_71 g_36 g_82 g_5 g_18.f4 g_18.f0 g_119 g_79 g_195 g_209 g_18.f2 g_222 g_220 g_199 g_208 g_241 g_240 g_254 g_282 g_237 g_280 g_347 g_238 g_365 g_390 g_408 g_391.f4 g_391.f9 g_391 g_501 g_508.f0 g_541 g_508.f4 g_511 g_512 g_434 g_601 g_537 g_499 g_508.f2 g_627 g_251 g_508.f1 g_553 g_628 g_542 g_555 g_433 g_802 g_809 g_876 g_500 g_366 g_279 g_18
+ * writes: g_39 g_40 g_71 g_18.f3 g_18.f4 g_36 g_82.f1 g_119 g_82.f4 g_2 g_79 g_195 g_199 g_209 g_5 g_82.f3 g_220 g_222 g_241 g_251 g_282 g_280 g_313 g_237 g_347 g_238 g_365 g_390 g_366 g_408 g_208 g_501 g_500 g_542 g_18.f1 g_434 g_254 g_541 g_672 g_433 g_279 g_825 g_809 g_876 g_540 g_537 g_802
+ */
+static struct S1 func_24(uint8_t p_25, int8_t p_26, int32_t * p_27, int32_t p_28)
+{ /* block id: 8 */
+ uint16_t *l_47 = &g_18.f3;
+ int16_t l_72 = 0xAD7DL;
+ int32_t l_74 = 0x16071ECCL;
+ int32_t l_575[6][3];
+ struct S1 l_592 = {0,-1419,958,232,442,9,-5643,122,57,4294967290UL};
+ uint16_t **l_700 = &g_601;
+ int32_t *l_782 = &g_433;
+ uint32_t l_827 = 4294967295UL;
+ int32_t l_938 = (-6L);
+ uint32_t l_957 = 0xD9715F58L;
+ int8_t *l_1012 = (void*)0;
+ uint32_t l_1070[1];
+ uint32_t l_1081 = 1UL;
+ int32_t *l_1084 = &l_74;
+ int i, j;
+ for (i = 0; i < 6; i++)
+ {
+ for (j = 0; j < 3; j++)
+ l_575[i][j] = 0L;
+ }
+ for (i = 0; i < 1; i++)
+ l_1070[i] = 0xE68764B7L;
+ if (g_18.f1)
+ { /* block id: 9 */
+ int32_t *l_37 = (void*)0;
+ int32_t *l_38[4][4][10] = {{{(void*)0,&g_2,&g_2,&g_2,(void*)0,(void*)0,&g_39,&g_39,&g_2,&g_2},{(void*)0,&g_2,&g_2,&g_2,(void*)0,(void*)0,&g_2,(void*)0,&g_39,&g_39},{(void*)0,&g_2,&g_2,(void*)0,&g_39,&g_39,&g_39,&g_2,&g_39,&g_39},{&g_39,&g_2,&g_39,&g_2,&g_2,&g_39,&g_2,&g_39,&g_39,&g_39}},{{&g_2,&g_39,&g_39,&g_2,&g_2,&g_2,&g_39,&g_2,&g_2,&g_2},{&g_39,(void*)0,&g_39,&g_39,&g_2,&g_2,&g_39,&g_2,&g_2,&g_39},{&g_39,&g_39,&g_39,&g_2,&g_39,&g_39,&g_2,&g_2,&g_2,&g_39},{(void*)0,&g_39,&g_2,&g_39,(void*)0,&g_39,&g_39,&g_2,(void*)0,&g_39}},{{&g_2,&g_2,(void*)0,&g_2,(void*)0,&g_39,&g_2,&g_2,&g_39,&g_39},{&g_2,&g_2,&g_2,&g_39,(void*)0,(void*)0,&g_2,&g_2,&g_2,&g_39},{&g_2,&g_39,&g_39,(void*)0,&g_39,(void*)0,(void*)0,&g_39,(void*)0,&g_39},{&g_39,&g_39,&g_39,(void*)0,&g_2,&g_2,&g_2,&g_39,(void*)0,(void*)0}},{{(void*)0,&g_39,&g_2,&g_2,&g_39,&g_2,&g_2,&g_2,&g_39,&g_2},{&g_2,&g_39,&g_39,&g_2,(void*)0,&g_2,(void*)0,(void*)0,&g_39,&g_2},{&g_2,&g_39,&g_2,&g_39,&g_2,&g_39,&g_2,&g_39,(void*)0,(void*)0},{&g_39,(void*)0,&g_39,&g_39,&g_2,(void*)0,&g_39,&g_39,&g_39,&g_39}}};
+ int32_t *l_61[2][1];
+ uint16_t *l_70 = &g_71;
+ uint8_t *l_73[2];
+ int16_t *l_75 = (void*)0;
+ int16_t *l_76 = (void*)0;
+ int16_t *l_77 = &l_72;
+ uint16_t *l_78 = &g_79;
+ struct S1 l_603 = {3,-2739,1333,112,1230,-2,4967,47,47,0xB711FC9EL};
+ uint8_t **l_675 = &l_73[0];
+ int32_t l_695 = 7L;
+ uint16_t l_749[7][10][3] = {{{0UL,65529UL,0xC0C0L},{65535UL,65529UL,0x94E8L},{0x61EEL,0x8649L,9UL},{0xEF64L,65535UL,0x0753L},{65535UL,0x8FD1L,0x62BAL},{0xDD08L,0x8DCEL,0x4F98L},{65526UL,1UL,65535UL},{0xE257L,0x0394L,0xE257L},{0x0394L,65535UL,65535UL},{0xCE6DL,65535UL,0x05EEL}},{{1UL,0x4888L,1UL},{1UL,0xE257L,1UL},{1UL,1UL,65529UL},{0xCE6DL,1UL,0xE143L},{0x0394L,0x05EEL,65528UL},{0xE257L,0xBEEBL,0xF789L},{65526UL,0x55B4L,65531UL},{0xDD08L,1UL,0xBB19L},{65535UL,0xBB19L,65535UL},{0xEF64L,0xCE6DL,0x9B57L}},{{0x61EEL,65535UL,0x105EL},{65535UL,0xABD0L,0x105EL},{0UL,65526UL,0x9B57L},{0x0C0CL,1UL,65535UL},{0xF789L,0x94E8L,0xBB19L},{0x4F98L,0x0753L,65531UL},{65535UL,0xFC46L,0xF789L},{0xE143L,65528UL,65535UL},{0xBEEBL,1UL,0x0C0CL},{0xBB19L,0x4888L,1UL}},{{1UL,9UL,1UL},{65535UL,65529UL,0xDF24L},{0x55B4L,9UL,65531UL},{0x1339L,0x4888L,1UL},{65535UL,1UL,0x33CFL},{65531UL,65535UL,9UL},{65526UL,0x105EL,65535UL},{0xDF24L,65529UL,0xBEEBL},{0xFC46L,0x4979L,65529UL},{1UL,1UL,0xEF64L}},{{1UL,0xE143L,0x4979L},{1UL,0x94E8L,0x61EEL},{1UL,0xEB09L,1UL},{1UL,0x2E04L,0x62BAL},{1UL,65535UL,0x8649L},{0xFC46L,1UL,0x105EL},{0xDF24L,65535UL,0x1339L},{65526UL,0xCE6DL,1UL},{65531UL,65531UL,65535UL},{65535UL,0xCBF3L,1UL}},{{0x1339L,0x8DCEL,0x1123L},{0x55B4L,0x33CFL,65535UL},{65535UL,0x1339L,0x1123L},{1UL,65535UL,1UL},{0xBB19L,5UL,65535UL},{0xBEEBL,0x9B57L,1UL},{0x0C0CL,0xFC46L,0x1339L},{0xEB09L,1UL,0x105EL},{65535UL,0UL,0x8649L},{0x4888L,0x8DCEL,65535UL}},{{0xDD08L,65535UL,1UL},{0x4F98L,65535UL,0x55B4L},{65529UL,65535UL,0x62BAL},{65535UL,65535UL,0xFC46L},{0x105EL,0x8DCEL,0UL},{65526UL,9UL,65528UL},{0UL,1UL,0x05EEL},{65535UL,0xCBF3L,1UL},{0x8649L,65535UL,0x8649L},{65535UL,65531UL,0xCE6DL}}};
+ int32_t ** const *l_786[2][8][5] = {{{(void*)0,(void*)0,&g_365,(void*)0,&g_365},{&g_365,&g_365,&g_365,&g_365,&g_365},{(void*)0,&g_365,(void*)0,&g_365,(void*)0},{&g_365,&g_365,&g_365,&g_365,(void*)0},{&g_365,(void*)0,(void*)0,&g_365,(void*)0},{(void*)0,&g_365,&g_365,(void*)0,&g_365},{&g_365,&g_365,(void*)0,&g_365,&g_365},{&g_365,&g_365,&g_365,(void*)0,&g_365}},{{&g_365,&g_365,&g_365,&g_365,&g_365},{&g_365,&g_365,(void*)0,&g_365,&g_365},{&g_365,&g_365,&g_365,&g_365,&g_365},{&g_365,&g_365,&g_365,&g_365,&g_365},{&g_365,&g_365,&g_365,(void*)0,&g_365},{(void*)0,&g_365,(void*)0,&g_365,&g_365},{&g_365,&g_365,(void*)0,&g_365,&g_365},{&g_365,&g_365,&g_365,&g_365,(void*)0}}};
+ struct S1 **l_818 = &g_390;
+ int32_t l_860 = 8L;
+ int32_t l_892 = 0x202F9FF8L;
+ int i, j, k;
+ for (i = 0; i < 2; i++)
+ {
+ for (j = 0; j < 1; j++)
+ l_61[i][j] = &g_39;
+ }
+ for (i = 0; i < 2; i++)
+ l_73[i] = &g_18.f4;
+lbl_673:
+ g_40 ^= (g_39 &= (*p_27));
+ if ((func_41(g_18.f1, l_47, (safe_sub_func_int32_t_s_s((safe_mul_func_uint8_t_u_u((func_52(func_56(l_61[1][0], ((*l_77) = ((safe_sub_func_uint32_t_u_u(0xF8A1C32FL, ((l_74 |= (safe_mul_func_uint16_t_u_u(((*l_47) = (safe_sub_func_int16_t_s_s((g_40 , (safe_rshift_func_int8_t_s_s((g_18.f3 , ((*p_27) <= (*p_27))), 5))), (((*l_70) |= 65535UL) || p_25)))), l_72))) || p_25))) , (-2L))), l_78, &g_36[2]), g_82, l_77) && g_541), g_508[3][3][4].f4)), l_575[0][0])), g_391.f9, (*g_511)) != p_25))
+ { /* block id: 367 */
+ int32_t l_587 = 0xAFFEE3ACL;
+ uint8_t l_588 = 0xFBL;
+ int32_t l_602 = 0xF8DD99D7L;
+ if ((g_391.f1 == (*p_27)))
+ { /* block id: 368 */
+ uint16_t l_584 = 65535UL;
+ struct S1 l_591[9] = {{3,2063,1226,210,751,33,2362,168,69,0x04BFF210L},{3,2063,1226,210,751,33,2362,168,69,0x04BFF210L},{3,2063,1226,210,751,33,2362,168,69,0x04BFF210L},{3,2063,1226,210,751,33,2362,168,69,0x04BFF210L},{3,2063,1226,210,751,33,2362,168,69,0x04BFF210L},{3,2063,1226,210,751,33,2362,168,69,0x04BFF210L},{3,2063,1226,210,751,33,2362,168,69,0x04BFF210L},{3,2063,1226,210,751,33,2362,168,69,0x04BFF210L},{3,2063,1226,210,751,33,2362,168,69,0x04BFF210L}};
+ int i;
+ for (g_542 = 0; (g_542 <= 2); g_542 += 1)
+ { /* block id: 371 */
+ uint16_t l_581 = 0UL;
+ l_581++;
+ l_584--;
+ }
+ for (g_18.f1 = 0; (g_18.f1 <= 7); g_18.f1 += 1)
+ { /* block id: 377 */
+ l_588--;
+ }
+ for (g_238 = 0; (g_238 <= 2); g_238 += 1)
+ { /* block id: 382 */
+ for (g_82.f1 = 0; (g_82.f1 <= 1); g_82.f1 += 1)
+ { /* block id: 385 */
+ return l_591[3];
+ }
+ for (g_434 = 0; (g_434 <= 2); g_434 += 1)
+ { /* block id: 390 */
+ uint16_t **l_593 = (void*)0;
+ uint16_t **l_594 = &l_70;
+ struct S1 l_595 = {2,-2250,1129,1,2028,29,5333,169,16,6UL};
+ int i, j;
+ l_575[g_434][g_434] = (((*l_594) = (l_575[(g_434 + 2)][g_238] , (l_592 , &g_71))) == (void*)0);
+ return l_595;
+ }
+ }
+ }
+ else
+ { /* block id: 396 */
+ int32_t *l_596 = (void*)0;
+ l_602 |= func_41((((((void*)0 == l_596) , (safe_mod_func_int16_t_s_s((l_588 , (((((*l_78) = p_26) , l_47) != l_47) <= func_41((safe_add_func_uint32_t_u_u(func_41(p_26, g_601, l_587, l_72, (*g_511)), (*p_27))), &g_282, l_588, p_28, (*g_511)))), p_28))) , 0xADL) , g_434), l_75, p_26, l_592.f2, (*g_511));
+ }
+ }
+ else
+ { /* block id: 400 */
+ struct S0 *l_604 = (void*)0;
+ if ((*p_27))
+ { /* block id: 401 */
+ return l_603;
+ }
+ else
+ { /* block id: 403 */
+ struct S0 **l_605 = &l_604;
+ (*l_605) = l_604;
+ return l_603;
+ }
+ }
+ if ((l_575[2][2] |= func_87(l_72)))
+ { /* block id: 409 */
+ uint16_t l_631[6];
+ uint32_t l_637 = 0x181F7B27L;
+ int32_t l_670 = 0xD9A9CC58L;
+ uint32_t l_676[1];
+ struct S1 l_679[7][10][2] = {{{{2,-1595,443,51,912,38,-5277,33,28,1UL},{2,1593,542,200,804,28,4679,20,13,0x3BD0E54FL}},{{3,413,618,36,589,4,634,43,83,0xAF2EF906L},{1,-988,1433,245,1849,41,1390,72,82,0xE0E5DFA6L}},{{0,-523,834,104,710,-13,-2819,22,16,0UL},{3,-384,30,246,951,38,-5520,66,28,0UL}},{{0,2383,255,170,10,-40,4091,149,35,4294967295UL},{3,30,1123,48,463,-38,-3243,95,17,0x1E3FA1E9L}},{{0,-1550,67,243,803,1,3103,136,36,0x608032FFL},{0,-2441,1229,9,874,-6,2068,127,59,0xAFA15E54L}},{{0,184,615,146,238,40,-4905,150,1,0x5702A702L},{0,-2441,1229,9,874,-6,2068,127,59,0xAFA15E54L}},{{0,-1550,67,243,803,1,3103,136,36,0x608032FFL},{3,30,1123,48,463,-38,-3243,95,17,0x1E3FA1E9L}},{{0,2383,255,170,10,-40,4091,149,35,4294967295UL},{3,-384,30,246,951,38,-5520,66,28,0UL}},{{0,-523,834,104,710,-13,-2819,22,16,0UL},{1,-988,1433,245,1849,41,1390,72,82,0xE0E5DFA6L}},{{3,413,618,36,589,4,634,43,83,0xAF2EF906L},{2,1593,542,200,804,28,4679,20,13,0x3BD0E54FL}}},{{{2,-1595,443,51,912,38,-5277,33,28,1UL},{1,50,448,210,1100,13,348,78,35,0x1D982557L}},{{1,-2592,900,153,1735,-9,5150,41,17,0x0C603FAEL},{0,-1550,67,243,803,1,3103,136,36,0x608032FFL}},{{0,575,770,106,328,22,-2648,35,12,0x609DEBEDL},{0,-1153,207,214,16,-29,-1669,166,73,0xB9229B32L}},{{1,-988,1433,245,1849,41,1390,72,82,0xE0E5DFA6L},{0,184,615,146,238,40,-4905,150,1,0x5702A702L}},{{0,-1469,733,249,1993,-41,-3293,72,22,0UL},{0,575,770,106,328,22,-2648,35,12,0x609DEBEDL}},{{1,269,1195,186,100,-25,5627,56,53,0x7B86FED5L},{1,269,1195,186,100,-25,5627,56,53,0x7B86FED5L}},{{3,-806,807,85,912,-19,-4175,66,12,4294967295UL},{0,-2387,643,32,290,-16,1613,1,33,4294967295UL}},{{1,50,448,210,1100,13,348,78,35,0x1D982557L},{2,-737,1062,60,555,-8,-4603,152,31,0x138A5C71L}},{{2,-1165,326,103,1319,-1,1999,128,11,0xA99088DAL},{1,37,162,116,1092,11,530,45,61,1UL}},{{2,1593,542,200,804,28,4679,20,13,0x3BD0E54FL},{2,-1165,326,103,1319,-1,1999,128,11,0xA99088DAL}}},{{{2,-134,1348,152,1332,-22,-3446,85,60,0x6EEEC6EFL},{0,101,1325,216,1687,-7,3065,171,67,4294967293UL}},{{2,-134,1348,152,1332,-22,-3446,85,60,0x6EEEC6EFL},{2,-1165,326,103,1319,-1,1999,128,11,0xA99088DAL}},{{2,1593,542,200,804,28,4679,20,13,0x3BD0E54FL},{1,37,162,116,1092,11,530,45,61,1UL}},{{2,-1165,326,103,1319,-1,1999,128,11,0xA99088DAL},{2,-737,1062,60,555,-8,-4603,152,31,0x138A5C71L}},{{1,50,448,210,1100,13,348,78,35,0x1D982557L},{0,-2387,643,32,290,-16,1613,1,33,4294967295UL}},{{3,-806,807,85,912,-19,-4175,66,12,4294967295UL},{1,269,1195,186,100,-25,5627,56,53,0x7B86FED5L}},{{1,269,1195,186,100,-25,5627,56,53,0x7B86FED5L},{0,575,770,106,328,22,-2648,35,12,0x609DEBEDL}},{{0,-1469,733,249,1993,-41,-3293,72,22,0UL},{0,184,615,146,238,40,-4905,150,1,0x5702A702L}},{{1,-988,1433,245,1849,41,1390,72,82,0xE0E5DFA6L},{0,-1153,207,214,16,-29,-1669,166,73,0xB9229B32L}},{{0,575,770,106,328,22,-2648,35,12,0x609DEBEDL},{0,-1550,67,243,803,1,3103,136,36,0x608032FFL}}},{{{1,-2592,900,153,1735,-9,5150,41,17,0x0C603FAEL},{1,50,448,210,1100,13,348,78,35,0x1D982557L}},{{2,-1595,443,51,912,38,-5277,33,28,1UL},{2,1593,542,200,804,28,4679,20,13,0x3BD0E54FL}},{{3,413,618,36,589,4,634,43,83,0xAF2EF906L},{1,-988,1433,245,1849,41,1390,72,82,0xE0E5DFA6L}},{{0,-523,834,104,710,-13,-2819,22,16,0UL},{3,-384,30,246,951,38,-5520,66,28,0UL}},{{0,2383,255,170,10,-40,4091,149,35,4294967295UL},{3,30,1123,48,463,-38,-3243,95,17,0x1E3FA1E9L}},{{0,-1469,733,249,1993,-41,-3293,72,22,0UL},{2,-134,1348,152,1332,-22,-3446,85,60,0x6EEEC6EFL}},{{0,575,770,106,328,22,-2648,35,12,0x609DEBEDL},{2,-134,1348,152,1332,-22,-3446,85,60,0x6EEEC6EFL}},{{0,-1469,733,249,1993,-41,-3293,72,22,0UL},{2,1593,542,200,804,28,4679,20,13,0x3BD0E54FL}},{{2,-737,1062,60,555,-8,-4603,152,31,0x138A5C71L},{2,-1165,326,103,1319,-1,1999,128,11,0xA99088DAL}},{{3,-384,30,246,951,38,-5520,66,28,0UL},{1,50,448,210,1100,13,348,78,35,0x1D982557L}}},{{{3,-2429,38,9,1431,32,2622,125,11,0x26C6F8C5L},{3,-806,807,85,912,-19,-4175,66,12,4294967295UL}},{{0,2253,916,153,1215,-7,3059,88,8,4294967294UL},{1,269,1195,186,100,-25,5627,56,53,0x7B86FED5L}},{{3,30,1123,48,463,-38,-3243,95,17,0x1E3FA1E9L},{0,-1469,733,249,1993,-41,-3293,72,22,0UL}},{{1,-2592,900,153,1735,-9,5150,41,17,0x0C603FAEL},{1,-988,1433,245,1849,41,1390,72,82,0xE0E5DFA6L}},{{1,50,448,210,1100,13,348,78,35,0x1D982557L},{0,575,770,106,328,22,-2648,35,12,0x609DEBEDL}},{{3,2284,1046,224,1326,26,5594,127,73,1UL},{1,-2592,900,153,1735,-9,5150,41,17,0x0C603FAEL}},{{2,-1595,443,51,912,38,-5277,33,28,1UL},{2,-1595,443,51,912,38,-5277,33,28,1UL}},{{0,-1153,207,214,16,-29,-1669,166,73,0xB9229B32L},{3,413,618,36,589,4,634,43,83,0xAF2EF906L}},{{1,269,1195,186,100,-25,5627,56,53,0x7B86FED5L},{0,-523,834,104,710,-13,-2819,22,16,0UL}},{{0,-1550,67,243,803,1,3103,136,36,0x608032FFL},{0,2383,255,170,10,-40,4091,149,35,4294967295UL}}},{{{3,-806,807,85,912,-19,-4175,66,12,4294967295UL},{0,-1550,67,243,803,1,3103,136,36,0x608032FFL}},{{2,2884,1172,138,389,39,-2135,34,51,4294967293UL},{0,184,615,146,238,40,-4905,150,1,0x5702A702L}},{{2,2884,1172,138,389,39,-2135,34,51,4294967293UL},{0,-1550,67,243,803,1,3103,136,36,0x608032FFL}},{{3,-806,807,85,912,-19,-4175,66,12,4294967295UL},{0,2383,255,170,10,-40,4091,149,35,4294967295UL}},{{0,-1550,67,243,803,1,3103,136,36,0x608032FFL},{0,-523,834,104,710,-13,-2819,22,16,0UL}},{{1,269,1195,186,100,-25,5627,56,53,0x7B86FED5L},{3,413,618,36,589,4,634,43,83,0xAF2EF906L}},{{0,-1153,207,214,16,-29,-1669,166,73,0xB9229B32L},{2,-1595,443,51,912,38,-5277,33,28,1UL}},{{2,-1595,443,51,912,38,-5277,33,28,1UL},{1,-2592,900,153,1735,-9,5150,41,17,0x0C603FAEL}},{{3,2284,1046,224,1326,26,5594,127,73,1UL},{0,575,770,106,328,22,-2648,35,12,0x609DEBEDL}},{{1,50,448,210,1100,13,348,78,35,0x1D982557L},{1,-988,1433,245,1849,41,1390,72,82,0xE0E5DFA6L}}},{{{1,-2592,900,153,1735,-9,5150,41,17,0x0C603FAEL},{0,-1469,733,249,1993,-41,-3293,72,22,0UL}},{{3,30,1123,48,463,-38,-3243,95,17,0x1E3FA1E9L},{1,269,1195,186,100,-25,5627,56,53,0x7B86FED5L}},{{0,2253,916,153,1215,-7,3059,88,8,4294967294UL},{3,-806,807,85,912,-19,-4175,66,12,4294967295UL}},{{3,-2429,38,9,1431,32,2622,125,11,0x26C6F8C5L},{1,50,448,210,1100,13,348,78,35,0x1D982557L}},{{3,-384,30,246,951,38,-5520,66,28,0UL},{2,-1165,326,103,1319,-1,1999,128,11,0xA99088DAL}},{{2,-737,1062,60,555,-8,-4603,152,31,0x138A5C71L},{2,1593,542,200,804,28,4679,20,13,0x3BD0E54FL}},{{0,-1469,733,249,1993,-41,-3293,72,22,0UL},{2,-134,1348,152,1332,-22,-3446,85,60,0x6EEEC6EFL}},{{0,575,770,106,328,22,-2648,35,12,0x609DEBEDL},{2,-134,1348,152,1332,-22,-3446,85,60,0x6EEEC6EFL}},{{0,-1469,733,249,1993,-41,-3293,72,22,0UL},{2,1593,542,200,804,28,4679,20,13,0x3BD0E54FL}},{{2,-737,1062,60,555,-8,-4603,152,31,0x138A5C71L},{2,-1165,326,103,1319,-1,1999,128,11,0xA99088DAL}}}};
+ uint32_t l_708 = 0x1807D42BL;
+ int8_t *l_717 = &g_537[0];
+ const int16_t l_725 = 0x512FL;
+ int32_t **l_738 = &g_199;
+ int i, j, k;
+ for (i = 0; i < 6; i++)
+ l_631[i] = 65526UL;
+ for (i = 0; i < 1; i++)
+ l_676[i] = 0x17292FF8L;
+ for (p_28 = 0; (p_28 > (-30)); p_28--)
+ { /* block id: 412 */
+ int32_t * const l_624 = &g_541;
+ int32_t * const *l_623 = &l_624;
+ int32_t l_630 = 1L;
+ if ((*p_27))
+ { /* block id: 413 */
+ int8_t l_626 = 0x9FL;
+ for (p_26 = 0; (p_26 >= 0); p_26 -= 1)
+ { /* block id: 416 */
+ int32_t * const **l_625 = &l_623;
+ uint32_t *l_629 = &g_347;
+ uint8_t ***l_634 = &g_254;
+ int i;
+ (*p_27) = ((l_575[0][0] &= ((safe_rshift_func_uint16_t_u_s(g_537[p_26], 14)) != (safe_div_func_int8_t_s_s((l_592.f4 || (((safe_unary_minus_func_uint8_t_u(255UL)) && ((safe_mod_func_uint32_t_u_u(((*l_629) = (func_87(((safe_lshift_func_uint8_t_u_u(((safe_add_func_uint8_t_u_u(l_592.f9, (g_499[2][0] != ((safe_mul_func_uint16_t_u_u(((func_87(g_537[p_26]) & ((((*l_625) = l_623) != ((g_508[3][3][4].f2 && l_626) , g_627[3][7][1])) <= 5L)) <= 0x6DC3L), p_28)) <= 0x75C34126L)))) <= g_82.f0), p_25)) ^ 0UL)) , g_251)), g_537[p_26])) != p_26)) < 0xC6L)), g_391.f7)))) & 3L);
+ if (l_630)
+ break;
+ ++l_631[5];
+ (*l_634) = &l_73[1];
+ }
+ for (g_82.f3 = (-4); (g_82.f3 <= 2); ++g_82.f3)
+ { /* block id: 427 */
+ uint32_t *l_658 = (void*)0;
+ uint32_t *l_659 = &l_592.f9;
+ uint32_t *l_662 = &g_251;
+ int32_t l_667 = (-8L);
+ int8_t *l_668 = &g_36[3];
+ int16_t l_669 = (-1L);
+ int32_t **l_671 = (void*)0;
+ if (l_637)
+ break;
+ g_237 |= ((l_626 , (safe_rshift_func_int16_t_s_s(((((safe_mul_func_uint16_t_u_u((safe_add_func_uint32_t_u_u((p_26 ^ p_25), (l_630 = ((l_670 = (safe_rshift_func_uint8_t_u_s(((((*p_27) = (safe_add_func_int32_t_s_s(l_630, (l_592.f1 |= (safe_rshift_func_int16_t_s_s((0x8601L & ((safe_mod_func_uint8_t_u_u(g_508[3][3][4].f1, ((*l_668) = ((((*l_662) = ((safe_mul_func_uint16_t_u_u((((*l_77) = (g_82 , (func_41(((*l_624) = (safe_rshift_func_int8_t_s_u((safe_mod_func_uint32_t_u_u(((*l_662) = (--(*l_659))), (((*p_27) = (safe_rshift_func_int8_t_s_u((((safe_rshift_func_int16_t_s_s(p_26, 0)) && p_26) | p_28), p_26))) || g_222))), p_26))), l_70, l_667, p_25, (*g_511)) ^ p_25))) | l_575[0][0]), 0UL)) <= 0x419FL)) | l_631[5]) & l_592.f8)))) , l_669)), l_592.f7)))))) ^ (-1L)) != 0x087E7087L), 2))) < 8L)))), p_26)) , l_626) | 0x01F99D9AL) >= 4294967289UL), 15))) | p_28);
+ g_672[3] = ((*g_220) = (*g_220));
+ }
+ (*g_220) = &l_575[2][0];
+ for (g_433 = 0; (g_433 <= 0); g_433 += 1)
+ { /* block id: 447 */
+ int i, j;
+ if (g_18.f4)
+ goto lbl_673;
+ if ((*p_27))
+ break;
+ (*g_199) &= l_626;
+ }
+ }
+ else
+ { /* block id: 452 */
+ uint8_t ***l_674[8] = {(void*)0,(void*)0,(void*)0,(void*)0,(void*)0,(void*)0,(void*)0,(void*)0};
+ int i;
+ l_675 = g_254;
+ for (g_82.f1 = 5; (g_82.f1 >= 1); g_82.f1 -= 1)
+ { /* block id: 456 */
+ --l_676[0];
+ }
+ (*g_220) = (*g_220);
+ (*p_27) &= 0L;
+ }
+ if (l_676[0])
+ continue;
+ for (g_251 = 0; (g_251 <= 1); g_251 += 1)
+ { /* block id: 465 */
+ return (*g_390);
+ }
+ return l_679[5][2][1];
+ }
+ (*g_220) = (*g_220);
+ (*g_220) = (void*)0;
+ if (l_592.f6)
+ { /* block id: 472 */
+ uint32_t l_689 = 0xD04695A0L;
+ int32_t l_692 = (-1L);
+ int32_t l_718 = (-2L);
+ struct S1 **l_728 = &g_390;
+ struct S1 ***l_729 = &l_728;
+ int8_t ** const l_734 = &g_512;
+ for (g_282 = (-24); (g_282 <= 29); g_282 = safe_add_func_int8_t_s_s(g_282, 7))
+ { /* block id: 475 */
+ const int32_t * const l_682 = &g_238;
+ const int32_t **l_683 = (void*)0;
+ const int32_t **l_684 = (void*)0;
+ const int32_t *l_686 = &g_238;
+ const int32_t **l_685 = &l_686;
+ int32_t l_701 = (-1L);
+ uint32_t *l_711 = &g_347;
+ (*l_685) = l_682;
+ if ((safe_mod_func_uint8_t_u_u(l_689, g_119)))
+ { /* block id: 477 */
+ uint16_t l_702[6][8][5] = {{{0x7923L,8UL,0xC85DL,1UL,0x092FL},{65535UL,0x6D71L,65528UL,0x0282L,0x79AEL},{0x2CD4L,1UL,65535UL,0xE226L,0x6CCCL},{0x7923L,0x2CD4L,65535UL,1UL,0xBFC3L},{9UL,0x7590L,6UL,65535UL,7UL},{65528UL,65535UL,65535UL,0xBFC3L,0x299FL},{2UL,1UL,8UL,0x6CCCL,1UL},{65526UL,0xBE31L,65535UL,0x54AEL,1UL}},{{0x0282L,0xEE59L,65530UL,65531UL,0x299FL},{65535UL,65531UL,65532UL,65535UL,7UL},{0x584BL,0xAED2L,65532UL,6UL,0xBFC3L},{0x6CCCL,65527UL,0x7074L,0x295DL,6UL},{0UL,0x0282L,0xD366L,0xB7C5L,1UL},{0x7074L,0xBE31L,0xC85DL,0xC85DL,0xBE31L},{7UL,6UL,1UL,0x295DL,65532UL},{0x820AL,1UL,9UL,1UL,0xB7C5L}},{{0x299FL,0x7590L,0x81A7L,65532UL,0x820AL},{0x820AL,0x9253L,0x54AEL,65531UL,0x77B6L},{7UL,65535UL,65535UL,2UL,0x295DL},{0x7074L,0x6CCCL,65530UL,65532UL,0x7590L},{0UL,0x348CL,0x54AEL,0xBFC3L,0xEE59L},{0x6CCCL,0x12C3L,1UL,8UL,65528UL},{0x584BL,0x820AL,65526UL,65535UL,0x3B03L},{0xAED2L,65535UL,0x54AEL,0x3B03L,3UL}},{{0x3B03L,0x0282L,9UL,0xBFC3L,0x6CCCL},{65530UL,0x0282L,0xEE59L,65530UL,65531UL},{65535UL,65535UL,3UL,0xAED2L,0xC85DL},{0UL,0xB7C5L,1UL,0x820AL,0xB585L},{65535UL,1UL,65532UL,1UL,0x12C3L},{0x0282L,65535UL,65531UL,65528UL,0x9253L},{7UL,0x12C3L,65535UL,0xBFC3L,0xBFC3L},{0x5DE7L,8UL,0x5DE7L,0x81A7L,65535UL}},{{0x0282L,0x5DE7L,0x43CAL,8UL,0x77B6L},{0xBFC3L,65535UL,0x2CD4L,65535UL,1UL},{65531UL,0x7590L,0x43CAL,0x77B6L,0xBE31L},{65535UL,0x299FL,0x5DE7L,0x12C3L,0x7074L},{65528UL,9UL,65535UL,65535UL,0x7590L},{0x81A7L,0x3B03L,65531UL,65534UL,0xBE31L},{0xAED2L,65534UL,65532UL,0x0282L,0x348CL},{1UL,2UL,1UL,65535UL,0x9DBCL}},{{0x584BL,0x295DL,3UL,65532UL,65535UL},{1UL,0x81A7L,0xEE59L,65531UL,0x6D71L},{0x54AEL,0x348CL,0UL,65531UL,0x348CL},{65535UL,0x9253L,0x79AEL,0x092FL,0x299FL},{65530UL,0x7923L,65527UL,0x9253L,7UL},{0x5DE7L,0x54AEL,0x9DBCL,9UL,65530UL},{65535UL,65535UL,1UL,1UL,65532UL},{65535UL,1UL,0xBEBFL,0x81A7L,0x092FL}}};
+ int32_t l_707 = 0x15AB18EFL;
+ int i, j, k;
+ (*p_27) &= l_592.f9;
+ l_702[2][2][1] = (l_692 = ((*p_27) = ((safe_lshift_func_int16_t_s_u((((--(*l_70)) , (l_695 || ((*l_47) = g_36[7]))) != ((safe_lshift_func_int16_t_s_u((safe_add_func_uint16_t_u_u(l_631[5], 0x6158L)), 11)) & ((l_700 = &l_70) == (void*)0))), g_553)) , (l_701 &= (*p_27)))));
+ l_679[5][2][1].f1 = ((((safe_mul_func_uint8_t_u_u(g_241, l_670)) , ((*g_390) , (((l_702[2][2][1] > (!((((safe_mul_func_int16_t_s_s((l_679[5][2][1].f0 , p_25), l_702[2][2][1])) | func_41(((void*)0 != &l_692), &l_631[5], l_707, l_708, (*g_511))) , 2UL) ^ 0x3BL))) , g_238) == p_25))) ^ (-7L)) && 0x63B1L);
+ }
+ else
+ { /* block id: 487 */
+ struct S1 l_709 = {2,-2303,1271,97,843,34,-1511,148,89,8UL};
+ uint8_t ***l_710 = &l_675;
+ p_27 = (l_709 , (void*)0);
+ (*l_710) = g_254;
+ l_692 = (l_689 < (0x6EC1D1A8L < ((void*)0 == l_711)));
+ return l_709;
+ }
+ for (p_26 = 8; (p_26 <= 15); p_26 = safe_add_func_uint16_t_u_u(p_26, 9))
+ { /* block id: 495 */
+ uint16_t l_716 = 65531UL;
+ l_718 ^= (((l_637 || ((((safe_rshift_func_uint8_t_u_u((0UL ^ (((*l_711) |= func_41((*g_628), &g_79, l_716, l_692, l_717)) < (p_25 ^ p_25))), p_25)) <= p_28) ^ (*l_682)) < p_28)) & p_28) && l_689);
+ if (l_592.f4)
+ goto lbl_1085;
+ (*p_27) = (safe_mul_func_int8_t_s_s(((*g_390) , (p_26 , ((p_25 <= (g_542 < ((safe_add_func_uint16_t_u_u(((*l_70)--), p_26)) ^ (l_701 = (*p_27))))) , (((l_725 == ((((*p_27) ^ (safe_sub_func_int8_t_s_s(l_692, l_670))) <= l_679[5][2][1].f5) != l_631[5])) < g_5) ^ l_689)))), 0xD5L));
+ if (l_670)
+ continue;
+ }
+ }
+ (*l_729) = l_728;
+ (*p_27) = (((*l_77) = (safe_sub_func_int16_t_s_s((safe_mod_func_int8_t_s_s((p_28 >= (l_734 != &g_512)), p_28)), (0x7C6050E9L ^ l_592.f5)))) | 65535UL);
+ }
+ else
+ { /* block id: 507 */
+ int32_t ***l_737[4][1][1] = {{{&g_220}},{{(void*)0}},{{&g_220}},{{(void*)0}}};
+ int i, j, k;
+ (*p_27) = ((*p_27) , (p_28 != ((*p_27) , ((l_738 = &p_27) == (void*)0))));
+ }
+ }
+ else
+ { /* block id: 511 */
+ int16_t l_743 = 1L;
+ uint16_t **l_746 = (void*)0;
+ uint16_t ***l_747 = &l_700;
+ int32_t l_748[10] = {0xB2FC27D5L,3L,3L,0xB2FC27D5L,3L,3L,0xB2FC27D5L,3L,3L,0xB2FC27D5L};
+ int32_t *l_761 = (void*)0;
+ int32_t ***l_785 = (void*)0;
+ struct S0 l_826 = {0x59DC1ED7L,0x78C5L,1UL,0x2F09L,1UL};
+ uint32_t l_833[9] = {18446744073709551614UL,0x2696DEC0L,18446744073709551614UL,18446744073709551614UL,0x2696DEC0L,18446744073709551614UL,18446744073709551614UL,0x2696DEC0L,18446744073709551614UL};
+ int i;
+ (*g_220) = (l_592 , (*g_220));
+ if (((*p_27) | (safe_mul_func_int16_t_s_s((safe_sub_func_int16_t_s_s(((l_743 == 0x9BDFL) , p_26), (((safe_sub_func_uint16_t_u_u((p_25 >= l_592.f5), ((*l_47) |= g_282))) , &l_78) != ((*l_747) = l_746)))), 0x5BEBL))))
+ { /* block id: 515 */
+ int8_t *l_778 = &g_36[3];
+ ++l_749[1][8][2];
+ (*g_220) = (p_28 , (*g_220));
+ for (g_280 = (-17); (g_280 == (-28)); g_280 = safe_sub_func_uint8_t_u_u(g_280, 9))
+ { /* block id: 520 */
+ return (*g_390);
+ }
+ for (l_592.f9 = 0; (l_592.f9 < 58); l_592.f9 = safe_add_func_int8_t_s_s(l_592.f9, 8))
+ { /* block id: 525 */
+ uint8_t l_777 = 1UL;
+ int32_t * const l_779 = (void*)0;
+ int32_t **l_780 = (void*)0;
+ int32_t **l_781 = &l_38[3][2][7];
+ for (g_82.f4 = 0; (g_82.f4 != 34); ++g_82.f4)
+ { /* block id: 528 */
+ uint8_t l_758 = 0x64L;
+ uint32_t *l_776[6] = {&g_391.f9,&g_391.f9,&g_391.f9,&g_391.f9,&g_391.f9,&g_391.f9};
+ int i;
+ --l_758;
+ l_761 = p_27;
+ (*p_27) = func_41(p_26, &l_749[1][8][2], p_28, ((safe_rshift_func_int8_t_s_s((safe_div_func_uint32_t_u_u((safe_add_func_int8_t_s_s(func_41((l_592.f3 == 2UL), &g_71, (g_555[0][0] , (safe_mod_func_int16_t_s_s(((((((((safe_mod_func_uint32_t_u_u((safe_mod_func_uint16_t_u_u(((*l_70) = ((*l_761) == ((safe_lshift_func_int16_t_s_s(((l_74 ^= g_391.f9) > g_408), 2)) , g_433))), p_28)), (*p_27))) | 0L) < p_26) , p_25) == p_26) , l_758) == 248UL) != 0x274DL), l_777))), p_28, (*g_511)), 0x6DL)), 0x4355FD78L)), l_758)) & l_592.f4), l_778);
+ }
+ (*l_781) = l_779;
+ }
+ }
+ else
+ { /* block id: 537 */
+ uint32_t l_793[5];
+ uint8_t l_817[8];
+ int32_t l_830 = 7L;
+ int32_t l_831 = 0L;
+ int32_t l_894 = 0xF408C4C0L;
+ uint16_t l_895 = 0UL;
+ int i;
+ for (i = 0; i < 5; i++)
+ l_793[i] = 0x154D16D8L;
+ for (i = 0; i < 8; i++)
+ l_817[i] = 9UL;
+ l_782 = p_27;
+ if ((g_508[3][3][4].f4 >= (safe_lshift_func_int8_t_s_s((l_785 != l_786[0][1][4]), 2))))
+ { /* block id: 539 */
+ uint8_t l_789 = 0x62L;
+ int32_t l_792[9][3][3] = {{{0x1206CF87L,0xD4342978L,0x56D0F252L},{0x1206CF87L,0L,1L},{0xB6B593C1L,0xE970D550L,0L}},{{1L,0xFA8A9F6DL,1L},{0x05365D73L,(-4L),0x56D0F252L},{0xD7896F25L,(-4L),0x47F85DFFL}},{{0L,0xFA8A9F6DL,1L},{0x9D5E6CF8L,0xE970D550L,0L},{0L,0L,0xB6B593C1L}},{{0xD7896F25L,0xD4342978L,0xB6B593C1L},{0x05365D73L,1L,0L},{1L,(-3L),0x47F85DFFL}},{{1L,(-1L),0xD7896F25L},{1L,(-4L),0xB6B593C1L},{1L,0xD48DE2AFL,0x05365D73L}},{{1L,0L,0x66D72F6FL},{0x05365D73L,0L,0x05365D73L},{0L,0xE970D550L,0xB6B593C1L}},{{0x1206CF87L,0xE970D550L,0xD7896F25L},{9L,0L,0x47F85DFFL},{0x56D0F252L,0L,9L}},{{9L,0xD48DE2AFL,1L},{0x1206CF87L,(-4L),1L},{0L,(-1L),9L}},{{0x05365D73L,(-3L),0x47F85DFFL},{1L,(-1L),0xD7896F25L},{1L,(-4L),0xB6B593C1L}}};
+ int i, j, k;
+ l_792[2][1][1] &= ((((safe_sub_func_int8_t_s_s(func_87((((l_789 >= ((*l_77) = (0x3740392DL < (p_25 < (*l_782))))) | (safe_mod_func_int16_t_s_s(p_28, l_789))) , (0xEDL != 255UL))), p_25)) >= p_25) & p_26) || 0x647CL);
+ for (g_501 = 0; (g_501 <= 0); g_501 += 1)
+ { /* block id: 544 */
+ int8_t *l_816 = &g_279;
+ l_793[1] |= (*p_27);
+ (*l_782) = ((safe_rshift_func_int16_t_s_s(func_41(((safe_lshift_func_int8_t_s_s(0L, 7)) , (((safe_sub_func_int16_t_s_s(((*l_77) = (safe_rshift_func_int8_t_s_s(0x05L, 6))), (p_27 != p_27))) ^ ((((!(((g_802 > (+0xAA05L)) & ((safe_mul_func_int8_t_s_s(((*l_816) = ((((safe_mul_func_int8_t_s_s((safe_rshift_func_uint16_t_u_u(g_809[0][0][0], 5)), 0x85L)) , (((safe_lshift_func_int16_t_s_s((safe_add_func_uint16_t_u_u(((safe_mod_func_uint8_t_u_u((0x08L != g_391.f0), g_241)) <= 0x1BL), 0x0014L)), p_25)) != g_408) , g_82.f0)) < (*p_27)) > p_25)), l_817[1])) , p_28)) == g_508[3][3][4].f1)) , l_818) != (void*)0) <= p_26)) || 0L)), &g_802, l_817[5], p_26, (*g_511)), 2)) && 253UL);
+ }
+ (*l_818) = (*l_818);
+ }
+ else
+ { /* block id: 551 */
+ int32_t l_832 = 0L;
+ int8_t *l_838 = &g_809[0][0][7];
+ int16_t l_849 = 0x28ACL;
+ for (g_18.f3 = 0; (g_18.f3 <= 0); g_18.f3 += 1)
+ { /* block id: 554 */
+ int16_t l_828 = 0x7066L;
+ int32_t l_829 = 1L;
+ if ((*p_27))
+ break;
+ (*l_782) = (safe_mul_func_uint8_t_u_u(g_240, (((safe_mul_func_int16_t_s_s((safe_mul_func_int8_t_s_s((*l_782), ((*l_782) <= p_25))), (0x2E7EL < ((g_825[1][1][0] = p_27) == p_27)))) <= g_508[3][3][4].f0) > ((*l_70) = (((l_826 , l_827) , &l_700) != &l_700)))));
+ ++l_833[0];
+ }
+ l_831 &= (safe_mod_func_int8_t_s_s((func_87(p_25) , ((((p_28 != ((*l_838) ^= 0x4BL)) || p_26) <= (safe_lshift_func_uint16_t_u_u(p_28, 15))) && (safe_rshift_func_uint16_t_u_u((safe_mul_func_int8_t_s_s(((safe_rshift_func_uint16_t_u_u((safe_lshift_func_uint16_t_u_u(g_282, (*l_782))), 11)) && (((&g_628 != (void*)0) >= (*l_782)) != l_849)), 255UL)), 10)))), l_592.f6));
+ if ((*p_27))
+ { /* block id: 563 */
+ uint32_t *l_859 = &l_793[1];
+ (*g_220) = ((p_25 || 255UL) , (((safe_mod_func_uint16_t_u_u((safe_unary_minus_func_uint16_t_u((*l_782))), func_41((safe_div_func_uint32_t_u_u((safe_mod_func_uint16_t_u_u(l_817[1], p_28)), ((*l_859) |= (safe_rshift_func_uint16_t_u_u(65526UL, 1))))), &l_749[1][7][0], p_28, ((*l_78) ^= 0xA894L), (*g_511)))) , 0UL) , (*g_220)));
+ (*l_782) &= (l_748[4] = l_830);
+ }
+ else
+ { /* block id: 569 */
+ uint16_t l_877 = 1UL;
+ uint32_t *l_878 = &g_347;
+ (*p_27) &= l_860;
+ l_830 |= ((safe_rshift_func_uint16_t_u_s(0UL, (safe_sub_func_uint16_t_u_u(l_849, ((safe_mul_func_uint16_t_u_u(0UL, ((((safe_lshift_func_uint8_t_u_u((safe_lshift_func_int8_t_s_u((safe_mod_func_int32_t_s_s(((safe_unary_minus_func_int32_t_s(0x03A43780L)) ^ ((safe_div_func_uint32_t_u_u((g_876 , l_877), l_877)) >= (p_26 = (((((*l_782) = (*p_27)) && ((*l_878) = (p_25 && g_391.f4))) , 4294967295UL) || l_817[1])))), l_877)), 7)), 1)) , g_553) || l_817[1]) , 1L))) >= p_28))))) >= 0x766AL);
+ }
+ }
+ for (l_743 = 2; (l_743 >= 0); l_743 -= 1)
+ { /* block id: 579 */
+ int16_t * const *l_879 = (void*)0;
+ int16_t * const **l_880 = (void*)0;
+ int16_t * const **l_881 = &l_879;
+ int32_t l_884 = 1L;
+ int32_t l_889[3][4] = {{0xEE9CF121L,0x412F2CC4L,0x412F2CC4L,0xEE9CF121L},{1L,0x412F2CC4L,0L,0x412F2CC4L},{0x412F2CC4L,(-1L),0L,0L}};
+ struct S0 * const l_900 = &g_508[3][3][4];
+ int i, j;
+ for (l_592.f9 = 0; (l_592.f9 <= 0); l_592.f9 += 1)
+ { /* block id: 582 */
+ if (g_391.f5)
+ goto lbl_673;
+ }
+ (*l_881) = l_879;
+ for (g_241 = 1; (g_241 <= 9); g_241 += 1)
+ { /* block id: 588 */
+ int32_t l_882 = 0x18650A18L;
+ int32_t l_883 = 0x4796B007L;
+ int32_t l_885 = 0xB890EDFAL;
+ int32_t l_886 = 0xC2F30DA4L;
+ int32_t l_887 = 5L;
+ int32_t l_888 = 1L;
+ int32_t l_890 = (-9L);
+ int32_t l_891 = 0L;
+ int32_t l_893[4];
+ int i, j;
+ for (i = 0; i < 4; i++)
+ l_893[i] = (-1L);
+ --l_895;
+ return (*g_390);
+ }
+ for (g_434 = 2; (g_434 >= 0); g_434 -= 1)
+ { /* block id: 594 */
+ int32_t **l_898 = (void*)0;
+ int32_t **l_899 = &l_37;
+ struct S0 *l_902 = &g_508[2][2][3];
+ struct S0 **l_901 = &l_902;
+ int i, j;
+ l_575[(g_434 + 1)][g_434] = l_575[(l_743 + 1)][g_434];
+ (*l_899) = ((*g_220) = &l_575[(l_743 + 1)][g_434]);
+ (*g_220) = p_27;
+ (*l_901) = l_900;
+ }
+ }
+ }
+ }
+ }
+ else
+ { /* block id: 604 */
+ struct S1 * const l_903 = &g_391;
+ const int8_t *l_909 = &g_910;
+ int32_t l_922 = 0xD6581181L;
+ uint32_t l_936 = 4294967291UL;
+ uint16_t l_937 = 65526UL;
+ int8_t *l_939 = &g_537[0];
+ int8_t l_949 = 0xBCL;
+ struct S1 * const *l_993 = &g_390;
+ struct S0 *l_1040 = &g_82;
+ int32_t l_1080[8][9][1] = {{{0x02266532L},{1L},{(-7L)},{0x5385CC6DL},{(-7L)},{1L},{0x02266532L},{1L},{(-7L)}},{{0x5385CC6DL},{(-7L)},{1L},{0x02266532L},{1L},{(-7L)},{0x5385CC6DL},{(-7L)},{1L}},{{0x02266532L},{1L},{(-7L)},{0x5385CC6DL},{(-7L)},{1L},{0x02266532L},{1L},{(-7L)}},{{0x5385CC6DL},{(-7L)},{1L},{0x02266532L},{1L},{(-7L)},{0x5385CC6DL},{(-7L)},{1L}},{{0x02266532L},{0x5385CC6DL},{0x02266532L},{1L},{0x02266532L},{0x5385CC6DL},{(-1L)},{0x5385CC6DL},{0x02266532L}},{{1L},{0x02266532L},{0x5385CC6DL},{(-1L)},{0x5385CC6DL},{0x02266532L},{1L},{0x02266532L},{0x5385CC6DL}},{{(-1L)},{0x5385CC6DL},{0x02266532L},{1L},{0x02266532L},{0x5385CC6DL},{(-1L)},{0x5385CC6DL},{0x02266532L}},{{1L},{0x02266532L},{0x5385CC6DL},{(-1L)},{0x5385CC6DL},{0x02266532L},{1L},{0x02266532L},{0x5385CC6DL}}};
+ int i, j, k;
+ (*g_220) = &l_575[0][0];
+lbl_921:
+ (*g_220) = (void*)0;
+ if ((&g_391 == (((*l_47) &= g_500) , l_903)))
+ { /* block id: 608 */
+ uint32_t l_908[1][9][2] = {{{0UL,0UL},{0UL,0UL},{0UL,0UL},{0UL,0UL},{0UL,0UL},{0UL,0UL},{0UL,0UL},{0UL,0UL},{0UL,0UL}}};
+ uint16_t *l_912 = (void*)0;
+ struct S0 **l_942 = (void*)0;
+ int32_t l_950[5] = {0xB5B7BEC4L,0xB5B7BEC4L,0xB5B7BEC4L,0xB5B7BEC4L,0xB5B7BEC4L};
+ struct S1 *l_985 = &l_592;
+ int i, j, k;
+ for (g_18.f1 = (-19); (g_18.f1 < (-30)); g_18.f1 = safe_sub_func_uint32_t_u_u(g_18.f1, 4))
+ { /* block id: 611 */
+ struct S0 *l_919[2];
+ int32_t l_920 = 0xECCA13D5L;
+ uint8_t *l_925[2];
+ int16_t *l_953 = &g_508[3][3][4].f1;
+ int16_t *l_954 = (void*)0;
+ int16_t *l_955 = (void*)0;
+ int16_t *l_956 = &l_72;
+ struct S0 l_968 = {0xE448F1C2L,0x4F3DL,65534UL,1UL,0x56L};
+ int16_t l_971 = 5L;
+ int32_t l_977 = 0x9EC177B0L;
+ int32_t l_979 = 0L;
+ int32_t l_981 = 0x3404FE79L;
+ int i;
+ for (i = 0; i < 2; i++)
+ l_919[i] = &g_18;
+ for (i = 0; i < 2; i++)
+ l_925[i] = (void*)0;
+ if ((safe_div_func_uint32_t_u_u((p_28 , 4294967295UL), (*p_27))))
+ { /* block id: 612 */
+ if (l_908[0][8][0])
+ break;
+ }
+ else
+ { /* block id: 614 */
+ struct S0 l_911 = {0xF5429923L,-10L,0UL,65535UL,0x2EL};
+ int16_t *l_913[4][1][10] = {{{&l_72,&l_72,&l_911.f1,(void*)0,&l_911.f1,&l_72,&l_72,&l_911.f1,(void*)0,&l_911.f1}},{{&l_72,&l_72,&l_911.f1,(void*)0,&l_911.f1,&l_72,&l_72,&l_911.f1,(void*)0,&l_911.f1}},{{&l_72,&l_72,&l_911.f1,(void*)0,&l_911.f1,&l_72,&l_72,&l_911.f1,(void*)0,&l_911.f1}},{{&l_72,&l_72,&l_911.f1,(void*)0,&l_911.f1,&l_72,&l_72,(void*)0,&l_72,(void*)0}}};
+ int32_t l_914 = (-5L);
+ int32_t l_915 = 1L;
+ struct S1 **l_918 = &g_390;
+ int i, j, k;
+ (*l_782) &= (l_908[0][8][1] != (((l_915 = (l_914 = l_908[0][8][0])) != ((((safe_add_func_uint32_t_u_u((0x7C33L || (l_918 != (((((void*)0 != l_919[0]) , g_555[0][1]) , p_25) , &g_390))), l_911.f3)) || p_28) & 0xACDCL) < 0xC0L)) < l_920));
+ if (g_391.f2)
+ goto lbl_921;
+ }
+ }
+ }
+ else
+ { /* block id: 664 */
+ uint32_t l_1000 = 0x0E49DC54L;
+ int32_t l_1051 = 8L;
+ int32_t l_1053 = 0x7C5178F1L;
+ int8_t **l_1061 = &g_512;
+ for (g_876 = 17; (g_876 < 20); ++g_876)
+ { /* block id: 667 */
+ for (l_922 = 0; (l_922 != 2); l_922 = safe_add_func_uint32_t_u_u(l_922, 9))
+ { /* block id: 670 */
+ struct S1 * const *l_992 = &l_903;
+ struct S1 * const **l_991[10] = {&l_992,&l_992,&l_992,&l_992,&l_992,&l_992,&l_992,&l_992,&l_992,&l_992};
+ int32_t l_994 = 0xFEEF50B1L;
+ int i;
+ l_993 = &l_903;
+ for (g_222 = 0; (g_222 <= 0); g_222 += 1)
+ { /* block id: 674 */
+ int32_t *l_995 = (void*)0;
+ int32_t *l_996 = &g_238;
+ int32_t *l_997 = &g_434;
+ int32_t *l_998 = &l_994;
+ int32_t *l_999 = &g_433;
+ struct S1 **l_1003 = &g_390;
+ (*g_220) = (*g_220);
+ l_1000--;
+ (*l_1003) = &g_391;
+ }
+ }
+ }
+ if ((l_1000 , ((p_25 , l_949) || ((*l_782) = (safe_mod_func_uint32_t_u_u((safe_mod_func_uint8_t_u_u(func_41(p_25, &l_937, l_922, (safe_sub_func_uint16_t_u_u((safe_rshift_func_int8_t_s_u(g_5, 7)), (func_41(func_41((**g_365), &l_937, p_25, l_922, l_1012), &l_937, l_1000, p_25, (*g_511)) , (*l_782)))), (*g_511)), p_25)), p_25))))))
+ { /* block id: 682 */
+ int32_t l_1013 = 0x9ACA0752L;
+ int32_t l_1014 = (-5L);
+ l_1014 ^= (l_1013 <= p_28);
+ return (**l_993);
+ }
+ else
+ { /* block id: 685 */
+ (*p_27) = (*p_27);
+ }
+ for (g_279 = 0; (g_279 > 29); g_279 = safe_add_func_uint32_t_u_u(g_279, 8))
+ { /* block id: 690 */
+ uint16_t l_1029 = 0x98C6L;
+ int16_t **l_1035 = &g_313[1][2][2];
+ int16_t ***l_1034[9][1][1] = {{{&l_1035}},{{(void*)0}},{{&l_1035}},{{(void*)0}},{{&l_1035}},{{(void*)0}},{{&l_1035}},{{(void*)0}},{{&l_1035}}};
+ int32_t l_1036 = 0L;
+ uint32_t l_1054[1];
+ int16_t l_1072[8] = {1L,1L,1L,1L,1L,1L,1L,1L};
+ int i, j, k;
+ for (i = 0; i < 1; i++)
+ l_1054[i] = 1UL;
+ for (g_209 = 16; (g_209 >= 50); ++g_209)
+ { /* block id: 693 */
+ int8_t *l_1027[6][6][5] = {{{(void*)0,(void*)0,&g_280,(void*)0,(void*)0},{&g_809[0][0][0],&g_36[5],&g_279,&g_36[0],&g_280},{(void*)0,(void*)0,&g_537[0],(void*)0,(void*)0},{&g_280,&g_36[0],&g_279,&g_36[5],&g_809[0][0][0]},{(void*)0,(void*)0,&g_280,(void*)0,(void*)0},{&g_809[0][0][0],&g_36[0],(void*)0,&g_36[0],&g_809[0][0][0]}},{{(void*)0,(void*)0,&g_280,(void*)0,(void*)0},{&g_809[0][0][0],&g_36[5],&g_279,&g_36[0],&g_280},{(void*)0,(void*)0,&g_537[0],(void*)0,(void*)0},{&g_280,&g_36[0],&g_279,&g_36[5],&g_809[0][0][0]},{(void*)0,(void*)0,&g_280,(void*)0,(void*)0},{&g_809[0][0][0],&g_36[0],(void*)0,&g_36[0],&g_809[0][0][0]}},{{(void*)0,(void*)0,&g_280,(void*)0,(void*)0},{&l_949,(void*)0,&g_280,&g_809[2][0][2],&g_809[0][0][0]},{&g_40,(void*)0,(void*)0,(void*)0,&g_40},{&g_809[0][0][0],&g_809[2][0][2],&g_280,(void*)0,&l_949},{&g_40,&l_949,&g_809[4][0][4],(void*)0,&g_36[3]},{&l_949,&g_809[2][0][2],&g_279,&g_809[2][0][2],&l_949}},{{&g_36[3],(void*)0,&g_809[4][0][4],&l_949,&g_40},{&l_949,(void*)0,&g_280,&g_809[2][0][2],&g_809[0][0][0]},{&g_40,(void*)0,(void*)0,(void*)0,&g_40},{&g_809[0][0][0],&g_809[2][0][2],&g_280,(void*)0,&l_949},{&g_40,&l_949,&g_809[4][0][4],(void*)0,&g_36[3]},{&l_949,&g_809[2][0][2],&g_279,&g_809[2][0][2],&l_949}},{{&g_36[3],(void*)0,&g_809[4][0][4],&l_949,&g_40},{&l_949,(void*)0,&g_280,&g_809[2][0][2],&g_809[0][0][0]},{&g_40,(void*)0,(void*)0,(void*)0,&g_40},{&g_809[0][0][0],&g_809[2][0][2],&g_280,(void*)0,&l_949},{&g_40,&l_949,&g_809[4][0][4],(void*)0,&g_36[3]},{&l_949,&g_809[2][0][2],&g_279,&g_809[2][0][2],&l_949}},{{&g_36[3],(void*)0,&g_809[4][0][4],&l_949,&g_40},{&l_949,(void*)0,&g_280,&g_809[2][0][2],&g_809[0][0][0]},{&g_40,&g_40,&g_36[3],&g_40,(void*)0},{&g_40,&g_279,&g_809[0][0][0],&g_40,&g_279},{(void*)0,&g_809[4][0][4],&g_36[3],&g_40,&g_537[1]},{&g_279,&g_279,&g_36[3],&g_279,&g_279}}};
+ int32_t l_1028[6];
+ struct S0 **l_1041 = &l_1040;
+ int i, j, k;
+ for (i = 0; i < 6; i++)
+ l_1028[i] = 0x27D0BFBFL;
+ }
+ for (g_540 = 0; (g_540 <= (-29)); g_540 = safe_sub_func_uint8_t_u_u(g_540, 1))
+ { /* block id: 716 */
+ int8_t **l_1062 = &l_1012;
+ int8_t ***l_1063 = (void*)0;
+ int8_t ***l_1064 = &l_1062;
+ int32_t l_1067 = 7L;
+ uint8_t *l_1071 = &g_18.f4;
+ int32_t *l_1073 = &l_1067;
+ int32_t *l_1074 = &l_1051;
+ int32_t *l_1075 = &g_39;
+ int32_t *l_1076 = &l_1067;
+ int32_t *l_1077 = &g_238;
+ int32_t *l_1078 = &g_876;
+ int32_t *l_1079[2][3][4] = {{{&g_500,&g_876,&g_433,&g_876},{&g_876,&g_876,&g_433,&g_433},{&g_500,&g_500,&g_876,&g_433}},{{&g_876,&g_876,&g_876,&g_876},{&g_876,&g_876,&g_876,&g_876},{&g_500,&g_876,&g_433,&g_876}}};
+ int i, j, k;
+ (*g_220) = p_27;
+ l_1072[2] ^= (((*l_939) |= l_1029) , (((*l_1071) = (((*l_782) &= (g_18 , (*p_27))) & (l_922 |= ((1L < ((l_1054[0] && (l_1061 != ((*l_1064) = l_1062))) , ((g_802 = (safe_mod_func_uint16_t_u_u(((l_1067 | (safe_sub_func_uint8_t_u_u((l_937 && p_25), 0xAEL))) >= 0x51EFA7E7L), 0xE701L))) <= l_1070[0]))) <= (**g_220))))) , l_1067));
+ ++l_1081;
+ }
+ if (l_1072[7])
+ continue;
+ return (*g_390);
+ }
+ }
+ }
+lbl_1085:
+ (*l_1084) &= (*l_782);
+ (*g_220) = p_27;
+ return (*g_390);
+}
+
+
+/* ------------------------------------------ */
+/*
+ * reads : g_82.f1
+ * writes: g_82.f1 g_500
+ */
+static uint32_t func_41(int32_t p_42, uint16_t * p_43, int32_t p_44, uint16_t p_45, int8_t * p_46)
+{ /* block id: 359 */
+ int32_t l_580 = 4L;
+ for (g_82.f1 = (-1); (g_82.f1 < 7); g_82.f1++)
+ { /* block id: 362 */
+ int8_t l_578 = 0x96L;
+ int32_t *l_579 = &g_500;
+ (*l_579) = l_578;
+ l_580 &= (~p_42);
+ }
+ return l_580;
+}
+
+
+/* ------------------------------------------ */
+/*
+ * reads : g_18.f1 g_82 g_36 g_5 g_18.f4 g_71 g_18.f0 g_39 g_119 g_79 g_18.f3 g_2 g_195 g_209 g_18.f2 g_222 g_40 g_220 g_199 g_208 g_241 g_240 g_254 g_282 g_237 g_280 g_347 g_238 g_365 g_390 g_408 g_391.f4 g_391.f9 g_391 g_501 g_508.f0
+ * writes: g_36 g_39 g_82.f1 g_119 g_82.f4 g_2 g_79 g_195 g_199 g_209 g_18.f3 g_5 g_82.f3 g_220 g_222 g_241 g_251 g_40 g_282 g_280 g_313 g_237 g_347 g_71 g_238 g_365 g_18.f4 g_390 g_366 g_408 g_208 g_501
+ */
+static const uint16_t func_52(const int8_t * p_53, struct S0 p_54, uint16_t * p_55)
+{ /* block id: 23 */
+ int8_t *l_91 = &g_36[3];
+ int8_t *l_92[5];
+ int32_t l_574 = 0L;
+ int i;
+ for (i = 0; i < 5; i++)
+ l_92[i] = (void*)0;
+ l_574 = ((((*p_55) || (((p_54.f4 = g_18.f1) , (safe_lshift_func_int16_t_s_u(((p_54.f1 & (safe_mod_func_uint32_t_u_u(func_87((safe_mul_func_int16_t_s_s((((*p_55) > (g_82 , (*p_55))) >= (((*l_91) = (*p_53)) ^ p_54.f3)), ((l_92[1] = l_91) == (void*)0)))), l_574))) | 0xF0L), g_82.f2))) > p_54.f3)) ^ (*p_55)) != 0x7A4DDB26L);
+ return (*p_55);
+}
+
+
+/* ------------------------------------------ */
+/*
+ * reads : g_18.f4 g_36 g_39 g_209 g_408 g_18.f0 g_195 g_241
+ * writes: g_18.f4 g_39 g_209 g_408 g_18.f0 g_195 g_241
+ */
+static const int8_t * func_56(int32_t * p_57, int16_t p_58, uint16_t * p_59, int8_t * p_60)
+{ /* block id: 16 */
+ for (g_18.f4 = 27; (g_18.f4 >= 55); g_18.f4++)
+ { /* block id: 19 */
+ (*p_57) ^= g_36[3];
+ }
+ return p_60;
+}
+
+
+/* ------------------------------------------ */
+/*
+ * reads : g_5 g_18.f4 g_71 g_18.f0 g_39 g_82.f0 g_82.f1 g_36 g_119 g_82.f3 g_82.f4 g_79 g_18.f3 g_2 g_195 g_209 g_18.f2 g_222 g_40 g_220 g_199 g_208 g_241 g_240 g_254 g_282 g_82.f2 g_237 g_280 g_347 g_238 g_365 g_390 g_408 g_391.f4 g_391.f9 g_18.f1 g_391 g_501 g_508.f0
+ * writes: g_39 g_82.f1 g_119 g_36 g_82.f4 g_2 g_79 g_195 g_199 g_209 g_18.f3 g_5 g_82.f3 g_220 g_222 g_241 g_251 g_40 g_282 g_280 g_313 g_237 g_347 g_71 g_238 g_365 g_18.f4 g_390 g_366 g_408 g_208 g_501
+ */
+static uint32_t func_87(uint32_t p_88)
+{ /* block id: 27 */
+ int16_t l_99 = (-3L);
+ uint16_t *l_100 = &g_79;
+ uint16_t *l_101 = &g_79;
+ int16_t l_102 = 0x2A7AL;
+ uint32_t l_109 = 0x8BEEE5F8L;
+ struct S0 l_124[7][3] = {{{0xAE64750AL,-1L,65528UL,0UL,4UL},{0xAE64750AL,-1L,65528UL,0UL,4UL},{0xAE64750AL,-1L,65528UL,0UL,4UL}},{{0xAE64750AL,-1L,65528UL,0UL,4UL},{0xAE64750AL,-1L,65528UL,0UL,4UL},{0xAE64750AL,-1L,65528UL,0UL,4UL}},{{0xAE64750AL,-1L,65528UL,0UL,4UL},{0xAE64750AL,-1L,65528UL,0UL,4UL},{0xAE64750AL,-1L,65528UL,0UL,4UL}},{{0xAE64750AL,-1L,65528UL,0UL,4UL},{0xAE64750AL,-1L,65528UL,0UL,4UL},{0xAE64750AL,-1L,65528UL,0UL,4UL}},{{0xAE64750AL,-1L,65528UL,0UL,4UL},{0xAE64750AL,-1L,65528UL,0UL,4UL},{0xAE64750AL,-1L,65528UL,0UL,4UL}},{{0xAE64750AL,-1L,65528UL,0UL,4UL},{0xAE64750AL,-1L,65528UL,0UL,4UL},{0xAE64750AL,-1L,65528UL,0UL,4UL}},{{0xAE64750AL,-1L,65528UL,0UL,4UL},{0xAE64750AL,-1L,65528UL,0UL,4UL},{0xAE64750AL,-1L,65528UL,0UL,4UL}}};
+ int32_t l_163 = 0x4B2EDB8FL;
+ int8_t l_177[7];
+ uint32_t l_229 = 18446744073709551615UL;
+ int32_t l_233 = (-1L);
+ int32_t l_235 = 0xD2773083L;
+ int32_t l_236 = 0x58A2F2A6L;
+ int32_t l_246 = (-1L);
+ uint8_t *l_269 = (void*)0;
+ uint8_t **l_268 = &l_269;
+ int8_t *l_298 = &g_36[6];
+ int8_t **l_297[9] = {&l_298,&l_298,&l_298,&l_298,&l_298,&l_298,&l_298,&l_298,&l_298};
+ struct S1 l_311 = {3,-2389,162,110,1321,-10,-1534,54,17,1UL};
+ uint32_t l_386 = 18446744073709551611UL;
+ int8_t l_407 = (-9L);
+ uint32_t l_435 = 0x04C585D8L;
+ uint32_t l_454 = 0x06D19C9CL;
+ int32_t l_482 = 8L;
+ int16_t l_493 = 0x7372L;
+ struct S0 *l_507[1];
+ int i, j;
+ for (i = 0; i < 7; i++)
+ l_177[i] = 0x47L;
+ for (i = 0; i < 1; i++)
+ l_507[i] = &g_508[3][3][4];
+ if ((!(((safe_add_func_uint32_t_u_u(g_5, (4L && (safe_div_func_int8_t_s_s(g_18.f4, g_71))))) == ((safe_rshift_func_int16_t_s_s(p_88, 3)) , (((((((p_88 , ((l_99 , (void*)0) != (l_101 = l_100))) & 0x42C135D3L) ^ l_99) | p_88) <= l_99) , (void*)0) == &g_5))) > l_102)))
+ { /* block id: 29 */
+ const int32_t l_104 = 1L;
+ int32_t l_111 = 0L;
+ uint8_t *l_154 = &g_5;
+ uint32_t l_184 = 1UL;
+ int32_t *l_203 = &g_39;
+ int32_t *l_204 = (void*)0;
+ int32_t *l_205 = &l_111;
+ int32_t *l_206 = (void*)0;
+ int32_t *l_207[6][5][8] = {{{&g_39,&l_163,&g_2,(void*)0,&l_111,&g_2,&g_2,&l_163},{&l_111,&l_111,&g_39,&g_39,&g_39,&g_2,&g_2,&l_163},{&l_163,&g_39,&g_2,(void*)0,&g_2,&g_39,&l_163,&l_163},{&l_111,&l_163,&g_2,&l_163,&g_2,&g_2,&g_39,&g_39},{(void*)0,&g_2,&g_39,&g_2,&g_39,&l_111,&l_111,(void*)0}},{{&l_163,(void*)0,&l_163,&g_39,(void*)0,&l_111,&l_163,&l_163},{(void*)0,&l_163,&g_2,(void*)0,&g_2,&g_2,&g_2,&g_39},{&g_2,&g_39,&g_39,&g_39,&l_163,&g_2,&g_2,&l_111},{&g_2,&g_2,(void*)0,&g_39,(void*)0,(void*)0,&g_2,&g_39},{&g_2,&g_2,&g_39,&g_39,&g_2,&g_2,&l_163,&g_39}},{{&l_163,&g_2,&l_111,&g_2,&g_39,&g_2,&g_39,(void*)0},{&g_2,&g_39,&l_163,(void*)0,(void*)0,&l_163,&g_39,&g_2},{&g_2,(void*)0,&g_2,&l_111,&g_39,&l_111,&l_163,(void*)0},{&l_163,&g_39,&g_39,&g_2,&l_111,&l_111,(void*)0,(void*)0},{&g_39,(void*)0,&g_2,&g_2,&g_39,&g_2,(void*)0,&l_111}},{{&l_111,&l_111,&l_163,&g_39,&g_39,(void*)0,&g_2,&l_111},{(void*)0,&g_2,&l_163,&g_2,&g_39,&g_39,&l_111,(void*)0},{&g_39,&l_163,&l_111,&g_39,&g_39,&g_39,&l_163,&l_163},{&l_111,(void*)0,&g_2,&l_111,(void*)0,&l_163,&g_39,&g_2},{&g_39,(void*)0,(void*)0,&g_2,&l_111,&g_2,&g_39,&g_2}},{{&g_39,&l_111,&g_39,&g_39,&g_2,&l_111,&l_111,&g_2},{&l_163,&g_2,&g_2,(void*)0,(void*)0,&g_39,&g_2,&g_2},{&l_163,&g_39,&l_111,&g_39,&g_2,(void*)0,&g_39,&g_2},{&g_2,&g_2,(void*)0,&l_111,&g_39,&l_163,&g_39,&l_111},{&l_163,&l_111,&g_2,&g_39,&l_111,&g_39,&l_111,&g_39}},{{&g_39,&g_2,&g_39,&g_2,&g_39,&g_2,&l_163,&g_39},{(void*)0,&g_39,&g_39,&g_2,&g_2,&g_2,&g_2,&g_2},{&l_111,&g_2,(void*)0,&g_39,&g_2,(void*)0,&l_111,(void*)0},{&g_2,&l_163,&l_163,(void*)0,&g_39,(void*)0,&g_2,&g_2},{&g_39,&l_163,&g_39,&l_111,&l_163,&g_2,&l_163,&g_2}}};
+ int i, j, k;
+ if ((0UL >= g_18.f0))
+ { /* block id: 30 */
+ int32_t *l_103 = &g_39;
+ int32_t **l_108 = &l_103;
+ (*l_103) ^= p_88;
+ if (l_104)
+ { /* block id: 32 */
+ (*l_103) |= g_82.f0;
+ }
+ else
+ { /* block id: 34 */
+ int8_t * const l_107 = &g_40;
+ int8_t * const *l_106 = &l_107;
+ int8_t * const **l_105 = &l_106;
+ (*l_105) = (void*)0;
+ }
+ (*l_108) = &g_39;
+ }
+ else
+ { /* block id: 38 */
+ uint32_t l_112 = 0UL;
+ int32_t l_118[9] = {0x14109486L,0x33D78BCCL,0x14109486L,0x14109486L,0x33D78BCCL,0x14109486L,0x14109486L,0x33D78BCCL,0x14109486L};
+ uint8_t *l_155 = &l_124[4][2].f4;
+ int i;
+ if (((l_109 || l_104) == l_102))
+ { /* block id: 39 */
+ int32_t *l_110[3];
+ int i;
+ for (i = 0; i < 3; i++)
+ l_110[i] = &g_2;
+ l_112 ^= (l_111 |= 1L);
+ }
+ else
+ { /* block id: 42 */
+ uint32_t l_113 = 1UL;
+ int32_t l_117 = 0xE729AE47L;
+ int32_t l_192 = (-2L);
+ int32_t l_193 = 0x9EB32EB6L;
+ int32_t l_194 = (-3L);
+ for (g_82.f1 = 0; (g_82.f1 <= 7); g_82.f1 += 1)
+ { /* block id: 45 */
+ int32_t *l_164 = &l_111;
+ int i;
+ if ((g_36[g_82.f1] , 9L))
+ { /* block id: 46 */
+ int32_t *l_116[6] = {(void*)0,&g_2,(void*)0,(void*)0,&g_2,(void*)0};
+ int i;
+ ++l_113;
+ l_117 = g_36[g_82.f1];
+ --g_119;
+ }
+ else
+ { /* block id: 50 */
+ int32_t *l_122 = &l_111;
+ int32_t *l_123 = &l_117;
+ int8_t *l_129[5];
+ uint8_t *l_130 = &g_82.f4;
+ int i;
+ for (i = 0; i < 5; i++)
+ l_129[i] = &g_36[g_82.f1];
+ (*l_123) = ((*l_122) ^= g_36[g_82.f1]);
+ (*l_123) ^= ((l_124[4][2] , ((g_36[g_82.f1] , (p_88 && (safe_sub_func_int8_t_s_s((safe_add_func_int8_t_s_s(g_82.f3, ((((g_36[3] = g_18.f4) != ((*l_130)++)) && (safe_lshift_func_uint16_t_u_s((safe_mul_func_uint16_t_u_u((safe_rshift_func_int8_t_s_u((safe_lshift_func_int8_t_s_s((~((safe_rshift_func_uint16_t_u_u((safe_mod_func_uint8_t_u_u(g_5, (((*l_122) ^= (((safe_sub_func_int16_t_s_s(0xF46BL, ((((((g_18.f0 >= (safe_mod_func_uint16_t_u_u(p_88, l_124[4][2].f1))) || 65535UL) >= l_113) < p_88) < 0xB794862DL) && g_82.f0))) , 0UL) && 0UL)) , g_36[3]))), 13)) ^ p_88)), l_113)), 3)), p_88)), g_18.f0))) & 3L))), p_88)))) && g_36[g_82.f1])) | p_88);
+ if ((*l_123))
+ break;
+ }
+ if (g_39)
+ goto lbl_198;
+ for (g_119 = 0; (g_119 == 12); g_119++)
+ { /* block id: 61 */
+ int32_t *l_151 = &g_2;
+ uint8_t **l_156 = &l_155;
+ (*l_151) = (l_117 = 0x6B1119ABL);
+ (*l_151) = (p_88 == ((1UL > (l_154 != ((*l_156) = l_155))) | (((safe_mod_func_uint16_t_u_u(g_36[g_82.f1], (((*l_101) |= (safe_mod_func_uint16_t_u_u(p_88, 0x0427L))) || 0xE7B8L))) || (safe_sub_func_uint32_t_u_u(p_88, 0x82777045L))) != l_112)));
+ }
+ (*l_164) = (l_163 |= ((l_113 > 1L) >= ((-1L) | ((g_36[3] != 0x27924F71L) , l_104))));
+ for (p_88 = 0; (p_88 <= 7); p_88 += 1)
+ { /* block id: 72 */
+ uint32_t *l_178 = &l_112;
+ int32_t *l_179 = (void*)0;
+ int32_t l_180 = 0x58832062L;
+ int32_t *l_181 = &l_118[p_88];
+ int32_t *l_182 = (void*)0;
+ int32_t *l_183 = &l_118[6];
+ int i;
+ if (g_36[g_82.f1])
+ break;
+ l_180 = (safe_add_func_uint32_t_u_u(g_18.f3, ((*l_164) = (safe_rshift_func_int8_t_s_s((((safe_rshift_func_uint16_t_u_s(((*l_101)--), 5)) < 1L) == (l_117 | ((*l_178) = (((g_18.f0 || (l_118[p_88] = p_88)) ^ l_124[4][2].f1) < (safe_sub_func_int8_t_s_s(((((l_112 == ((l_163 = (((void*)0 == &g_71) == l_177[0])) >= l_104)) > l_113) & 252UL) & 0xC0L), 0x89L)))))), g_2)))));
+ l_184--;
+ (*l_183) = (*l_164);
+ }
+ }
+lbl_198:
+ for (l_112 = 0; (l_112 < 24); l_112++)
+ { /* block id: 86 */
+ int32_t *l_189 = (void*)0;
+ int32_t *l_190 = &l_111;
+ int32_t *l_191[9][7] = {{(void*)0,&l_118[8],&l_163,&l_163,&l_118[8],(void*)0,&l_118[0]},{(void*)0,&l_118[0],&l_163,&l_118[0],&g_39,&l_118[0],&l_118[8]},{&l_118[0],&l_117,(void*)0,(void*)0,&g_2,&l_118[8],&g_2},{&g_39,&l_118[0],&l_118[0],&g_39,&l_163,&l_118[0],(void*)0},{&g_39,&l_118[8],&l_118[0],&l_117,&g_39,&l_117,&l_163},{&l_118[0],&l_163,(void*)0,&l_118[0],(void*)0,&l_118[0],(void*)0},{(void*)0,(void*)0,&l_117,&l_117,&l_117,&l_118[0],&g_2},{(void*)0,&l_117,&g_2,&l_118[0],&l_163,&g_39,&l_118[0]},{&l_117,&l_163,&g_39,(void*)0,&g_39,&l_163,&l_117}};
+ int i, j;
+ ++g_195;
+ }
+ if (g_18.f4)
+ { /* block id: 90 */
+ g_199 = &g_2;
+ }
+ else
+ { /* block id: 92 */
+ const int32_t *l_201 = (void*)0;
+ const int32_t **l_200 = &l_201;
+ int32_t *l_202 = &l_192;
+ (*l_200) = (void*)0;
+ (*l_202) ^= (-2L);
+ }
+ l_193 = (((p_88 , ((void*)0 == &l_192)) ^ ((*l_101) = 0x9C0BL)) ^ 0x22F9L);
+ }
+ }
+ g_209++;
+ for (g_82.f4 = 2; (g_82.f4 <= 7); g_82.f4 += 1)
+ { /* block id: 103 */
+ uint16_t l_216 = 1UL;
+ int32_t l_232 = 5L;
+ int32_t l_239 = (-1L);
+ int8_t ***l_270 = (void*)0;
+ for (g_18.f3 = 0; (g_18.f3 <= 4); g_18.f3 += 1)
+ { /* block id: 106 */
+ uint32_t *l_217 = &l_184;
+ int32_t l_221 = (-9L);
+ int32_t l_234[5][5][8] = {{{0xB9C36536L,1L,0x3C2C6411L,0L,(-2L),0x63EE46ABL,5L,0xA1254473L},{0L,0x337FFAD2L,1L,0L,0x83C53249L,0xA1254473L,(-1L),0xD57E7891L},{0x540E818FL,0x559AB983L,0xA1254473L,0x5C0450BFL,0xA1254473L,0x559AB983L,0x540E818FL,(-1L)},{0xCA09B53EL,(-1L),1L,5L,(-7L),1L,0xA3AA631CL,0x99F47FE8L},{0x559AB983L,0xB1993FB8L,0x23F3548BL,0xA3AA631CL,(-7L),0xD57E7891L,0xF18445C7L,0x5C0450BFL}},{{0xCA09B53EL,0x5A902683L,0L,0x99F47FE8L,0xA1254473L,0x23F3548BL,(-1L),0x83C53249L},{0x540E818FL,0xCA09B53EL,0xB9C36536L,0x5A902683L,0x83C53249L,0x5C0450BFL,0xEE774041L,0L},{0L,1L,0xCA09B53EL,(-2L),(-2L),0xCA09B53EL,1L,0L},{0xB9C36536L,(-5L),1L,0xCA09B53EL,1L,0L,0x3C2C6411L,(-1L)},{0x3C2C6411L,0L,0x83C53249L,2L,0xCA09B53EL,0L,0x337FFAD2L,0x5A902683L}},{{0L,(-5L),0L,1L,5L,0L,0xCA09B53EL,0x3C2C6411L},{1L,0L,1L,1L,2L,0L,0L,0L},{0xB1993FB8L,0L,1L,0x5C0450BFL,1L,0x5C0450BFL,1L,0L},{(-5L),1L,1L,0L,0xA1254473L,5L,0x63EE46ABL,(-2L)},{(-7L),0x23F3548BL,(-1L),3L,(-5L),0xA3AA631CL,0x63EE46ABL,0xA1254473L}},{{0L,3L,1L,5L,0x337FFAD2L,0x99F47FE8L,1L,0L},{0x337FFAD2L,0x99F47FE8L,1L,0L,1L,0x5A902683L,0L,0x559AB983L},{0L,0L,1L,0xCA09B53EL,(-2L),(-2L),0xCA09B53EL,1L},{(-1L),(-1L),0xF18445C7L,1L,0x23F3548BL,0xCA09B53EL,0L,0x99F47FE8L},{0xA1254473L,0x540E818FL,(-7L),1L,0x559AB983L,2L,0xD57E7891L,0x99F47FE8L}},{{0x540E818FL,0x3C2C6411L,0xA3AA631CL,1L,1L,1L,0L,1L},{1L,0x89557B5DL,0L,0xCA09B53EL,0x3C2C6411L,(-1L),0x540E818FL,0x559AB983L},{0L,1L,0xEE774041L,0L,0xF18445C7L,0x99F47FE8L,0xF18445C7L,0x63EE46ABL},{0xEE774041L,0xCA09B53EL,0xEE774041L,1L,0x559AB983L,3L,2L,1L},{0x5A902683L,0x63EE46ABL,1L,0x5C0450BFL,0L,0x23F3548BL,0x559AB983L,0x89557B5DL}}};
+ const uint8_t *l_267 = &g_5;
+ int i, j, k;
+ if (((((((safe_add_func_int8_t_s_s(g_36[g_82.f4], (p_88 == (safe_mul_func_int8_t_s_s((((l_216 ^ ((void*)0 != &l_111)) == (((((*l_217) = (((*l_154) &= p_88) > g_18.f2)) >= ((-1L) > (safe_lshift_func_uint16_t_u_s((l_102 | l_99), l_124[4][2].f1)))) <= g_36[g_82.f4]) >= g_36[g_82.f4])) & 0x73132987L), p_88))))) || 0xDFED307DL) == g_39) || 0xB2D16ADBL) , 0x85EAL) <= 0x6F1BL))
+ { /* block id: 109 */
+ for (g_82.f3 = 0; (g_82.f3 <= 7); g_82.f3 += 1)
+ { /* block id: 112 */
+ int i;
+ return l_177[(g_18.f3 + 1)];
+ }
+ g_220 = &g_199;
+ (*l_203) = p_88;
+ if (((*l_205) &= l_177[4]))
+ { /* block id: 118 */
+ g_222++;
+ if (p_88)
+ break;
+ (*l_203) &= (g_2 = ((p_88 <= (safe_lshift_func_int16_t_s_s((l_221 != (g_82.f1 && g_40)), ((g_79++) >= g_18.f4)))) , p_88));
+ }
+ else
+ { /* block id: 124 */
+ (*g_220) = (void*)0;
+ }
+ }
+ else
+ { /* block id: 127 */
+ (*g_220) = (*g_220);
+ for (g_195 = 0; (g_195 <= 7); g_195 += 1)
+ { /* block id: 131 */
+ int i, j, k;
+ l_207[(g_18.f3 + 1)][g_18.f3][g_82.f4] = (void*)0;
+ l_229 ^= (l_207[g_18.f3][g_18.f3][(g_18.f3 + 1)] == l_207[g_18.f3][g_18.f3][g_195]);
+ l_163 = (safe_sub_func_int8_t_s_s(g_208, g_5));
+ }
+ l_232 ^= ((*l_205) = p_88);
+ }
+ g_241++;
+ if ((safe_mod_func_uint32_t_u_u((g_251 = ((p_88 , l_246) || ((safe_lshift_func_uint16_t_u_u((safe_rshift_func_int8_t_s_u(g_82.f4, (g_18.f4 > g_240))), l_216)) > (p_88 ^ (*l_203))))), l_234[4][4][1])))
+ { /* block id: 141 */
+ for (g_40 = 5; (g_40 >= 1); g_40 -= 1)
+ { /* block id: 144 */
+ return p_88;
+ }
+ for (l_239 = 4; (l_239 >= 0); l_239 -= 1)
+ { /* block id: 149 */
+ uint8_t * const *l_255 = (void*)0;
+ int32_t *l_256[7] = {(void*)0,(void*)0,(void*)0,(void*)0,(void*)0,(void*)0,(void*)0};
+ int i, j, k;
+ (*l_203) ^= (l_207[(g_18.f3 + 1)][l_239][(g_18.f3 + 2)] == &g_251);
+ (*l_205) = (g_36[g_82.f4] , (safe_mod_func_uint32_t_u_u(((*l_217) = (g_254 == l_255)), g_36[l_239])));
+ (*l_205) = (l_99 != ((l_235 = 0x5B3381A5L) , (safe_mod_func_int16_t_s_s(0x7712L, (safe_div_func_uint16_t_u_u((safe_div_func_uint16_t_u_u((((*l_203) = (((safe_rshift_func_int16_t_s_s(p_88, (safe_mul_func_uint8_t_u_u(((l_154 != l_267) >= (g_254 == l_268)), (!0xA9L))))) , (void*)0) != l_270)) >= g_222), l_124[4][2].f2)), p_88))))));
+ }
+ (*l_203) ^= (g_71 <= 0L);
+ }
+ else
+ { /* block id: 158 */
+ (*l_205) = ((((l_221 == p_88) <= ((safe_mod_func_uint8_t_u_u(5UL, 1UL)) && (safe_add_func_uint16_t_u_u(((&l_239 == &l_111) ^ (safe_mod_func_uint8_t_u_u((g_79 == (safe_sub_func_uint32_t_u_u((((*l_203) > 0x1999272AL) & p_88), 0L))), 0xFEL))), p_88)))) || (*l_205)) && 2L);
+ }
+ g_282--;
+ }
+ (*g_220) = (*g_220);
+ if ((*l_203))
+ break;
+ }
+ }
+ else
+ { /* block id: 166 */
+ uint8_t l_285 = 0x4CL;
+ int32_t l_299 = 0x89F5BDD3L;
+ int32_t l_306 = 0x5BC425B6L;
+ int32_t l_340 = (-4L);
+ int32_t l_341 = (-1L);
+ int32_t l_344 = 0xE829D8AAL;
+ int32_t l_346[7][8] = {{(-1L),(-1L),0xF04E8ED3L,0L,(-1L),0x3E5B3455L,(-1L),0L},{(-8L),(-1L),(-8L),0x3E5B3455L,(-1L),0x7B4FA158L,(-1L),0x7B4FA158L},{0x2880767BL,0x3E5B3455L,0xF04E8ED3L,0x3E5B3455L,0x2880767BL,0xF936D604L,(-1L),0L},{0x2880767BL,0xF936D604L,(-1L),0L,(-1L),0xF936D604L,0x2880767BL,0x3E5B3455L},{(-8L),0x3E5B3455L,(-1L),0x7B4FA158L,(-1L),0x7B4FA158L,(-1L),0x3E5B3455L},{(-1L),(-1L),0xF04E8ED3L,0L,(-1L),0x3E5B3455L,(-1L),0L},{(-8L),(-1L),(-8L),0x3E5B3455L,(-1L),0x7B4FA158L,(-1L),0x7B4FA158L}};
+ int32_t l_377 = 0x828E5972L;
+ struct S1 *l_404 = &g_391;
+ int32_t l_427 = 0x3D04868CL;
+ int16_t l_439 = 0L;
+ const uint8_t l_449 = 0x21L;
+ struct S0 *l_506 = &g_82;
+ struct S0 **l_505[2];
+ int32_t l_554 = 1L;
+ int i, j;
+ for (i = 0; i < 2; i++)
+ l_505[i] = &l_506;
+lbl_504:
+ if (l_285)
+ { /* block id: 167 */
+ for (l_99 = (-24); (l_99 != 2); l_99 = safe_add_func_int8_t_s_s(l_99, 6))
+ { /* block id: 170 */
+ uint32_t l_288 = 0xFD1AB546L;
+ return l_288;
+ }
+ }
+ else
+ { /* block id: 173 */
+ int32_t l_320[4][1][9] = {{{0L,0x194BB3C6L,0x8BCB9031L,0xB986918BL,0xB986918BL,0x8BCB9031L,0x194BB3C6L,0L,7L}},{{(-10L),0xB986918BL,3L,0L,0x67FAAF16L,7L,7L,0x67FAAF16L,0xB986918BL}},{{0L,0x039CAC54L,0L,0x8BCB9031L,7L,7L,(-10L),0x83995F0FL,0x83995F0FL}},{{0L,0x039CAC54L,0x83995F0FL,7L,0x83995F0FL,0x039CAC54L,0L,(-10L),0x194BB3C6L}}};
+ int32_t l_329 = (-1L);
+ int32_t l_342 = (-10L);
+ int32_t l_343 = 1L;
+ int32_t l_345 = (-1L);
+ int i, j, k;
+ for (g_5 = 0; (g_5 <= 20); ++g_5)
+ { /* block id: 176 */
+ (*g_220) = (*g_220);
+ l_299 ^= (0x6735L > (((g_82.f2 & (l_285 == (safe_mul_func_int16_t_s_s((-6L), (safe_mul_func_int8_t_s_s((((safe_mod_func_uint32_t_u_u((((void*)0 == l_297[4]) <= g_237), p_88)) , 3UL) ^ g_119), l_285)))))) == 4294967295UL) >= p_88));
+ }
+ if ((safe_lshift_func_int8_t_s_u(g_82.f2, (safe_lshift_func_uint8_t_u_u(l_233, l_177[0])))))
+ { /* block id: 180 */
+ uint16_t l_323 = 1UL;
+ for (g_280 = 23; (g_280 <= (-26)); g_280 = safe_sub_func_uint8_t_u_u(g_280, 3))
+ { /* block id: 183 */
+ uint32_t l_328 = 0x04263EA8L;
+ if (l_306)
+ { /* block id: 184 */
+ uint8_t *l_310 = &g_119;
+ int16_t *l_312 = (void*)0;
+ int32_t *l_321 = (void*)0;
+ int32_t *l_322 = &l_233;
+ l_320[3][0][0] = ((safe_mul_func_int16_t_s_s(((safe_unary_minus_func_uint8_t_u(((*l_310) &= p_88))) <= ((g_313[1][2][2] = (l_311 , l_312)) != (void*)0)), g_237)) == (((l_311 , (safe_rshift_func_uint16_t_u_u(((&g_282 == ((safe_mul_func_int16_t_s_s((safe_mul_func_uint16_t_u_u(g_5, g_82.f4)), 0x1FCCL)) , &g_71)) & 0xE3CFL), 6))) ^ p_88) , 0x06L));
+ (*l_322) = p_88;
+ l_235 ^= l_311.f5;
+ if (p_88)
+ continue;
+ }
+ else
+ { /* block id: 191 */
+ int16_t *l_324 = &l_124[4][2].f1;
+ int32_t *l_325 = &l_235;
+ int32_t l_326[6][8][5] = {{{(-1L),0L,0x77968830L,(-3L),0xF69D3694L},{0x80481311L,(-8L),0x6EE43BC7L,3L,0xF69D3694L},{9L,0xA3F52DB4L,0x332D84DCL,0x6EE43BC7L,2L},{0xB9E29AD6L,0x6EE43BC7L,8L,1L,0L},{0xD4BE4A73L,(-1L),0L,0x34B194B4L,1L},{0x332D84DCL,9L,0L,0L,9L},{0L,2L,0xC6B43B59L,1L,0xD4BE4A73L},{(-1L),8L,0xA5022890L,1L,(-1L)}},{{1L,0xB9E29AD6L,0xFF1388ADL,0x5D62FFCCL,(-4L)},{(-1L),0xA96E957DL,1L,0xC06D5091L,6L},{0L,0x075FB35CL,1L,8L,0x332D84DCL},{0x332D84DCL,0L,0xD4BE4A73L,0xA3F52DB4L,(-7L)},{0xD4BE4A73L,4L,(-1L),0x9E963DA1L,0x346217EBL},{0xB9E29AD6L,0xC3EFD975L,0x7C2A98AAL,0xAB407981L,0xC06D5091L},{9L,0x4A7388A2L,0xF9C56E4CL,(-7L),0x57D97B32L},{(-7L),0x3E1D9BA4L,0x093B7A13L,0x075FB35CL,(-4L)}},{{1L,0xAAC8C820L,2L,0x5D62FFCCL,0xA3F52DB4L},{1L,9L,0x5D62FFCCL,0xDAE7BCCAL,1L},{0xA96E957DL,(-4L),8L,0L,0L},{(-2L),0x4A7388A2L,(-2L),0xF69D3694L,0x9E963DA1L},{0xCA74A0EEL,1L,(-8L),1L,0L},{(-8L),0xA3F52DB4L,0x3E1D9BA4L,0x63D06EA8L,0x346217EBL},{(-4L),1L,(-8L),0L,(-1L)},{0L,(-3L),(-2L),(-1L),0x075FB35CL}},{{(-3L),0xF69D3694L,8L,1L,0x80481311L},{(-1L),9L,0x5D62FFCCL,(-1L),0x3E1D9BA4L},{9L,(-1L),2L,0x4A7388A2L,0xA96E957DL},{9L,0xC3EFD975L,0x093B7A13L,0x6EE43BC7L,1L},{0xA5022890L,0L,0xF9C56E4CL,0x6EE43BC7L,0xC3EFD975L},{1L,8L,0xA314B29BL,0x4A7388A2L,9L},{0L,0xAAA1835EL,1L,(-1L),0xAAC8C820L},{0x9E963DA1L,(-2L),(-1L),1L,0xB9E29AD6L}},{{(-3L),(-1L),0x34B194B4L,(-1L),(-3L)},{0xAAA1835EL,1L,4L,0xA314B29BL,3L},{0xAAA1835EL,0xDAE7BCCAL,0x57D97B32L,8L,0xAAC8C820L},{2L,(-1L),9L,0xF69D3694L,3L},{0xF553E666L,8L,0x075FB35CL,0xAAA1835EL,9L},{3L,0xD4BE4A73L,(-2L),(-3L),9L},{0xB9E29AD6L,0L,1L,0x9E963DA1L,0x6EE43BC7L},{1L,0xF553E666L,(-3L),0L,0xCA74A0EEL}},{{(-8L),(-1L),0xA3F52DB4L,1L,(-1L)},{0xA96E957DL,0L,1L,0xA5022890L,0x57D97B32L},{0xA96E957DL,1L,0xFF1388ADL,9L,(-7L)},{(-8L),(-1L),1L,9L,0x5D62FFCCL},{1L,0xA5022890L,8L,(-1L),1L},{0xB9E29AD6L,0L,1L,(-3L),1L},{3L,3L,(-1L),0L,(-4L)},{0xF553E666L,0x3E1D9BA4L,0xC3EFD975L,(-4L),1L}}};
+ int32_t *l_327[3][8][3] = {{{&l_236,(void*)0,&l_233},{&l_299,&l_299,&g_39},{(void*)0,&l_163,(void*)0},{&g_39,&l_236,&l_163},{&l_236,&g_2,&l_299},{&g_39,&l_299,&l_233},{&g_39,&g_39,&g_39},{&l_236,&l_233,(void*)0}},{{&g_238,&l_236,&l_299},{&l_299,&l_233,&l_236},{&l_233,(void*)0,&l_299},{&g_238,&l_233,(void*)0},{&g_238,&l_236,&g_39},{&g_39,&g_2,&l_236},{&l_236,&g_238,&g_39},{&g_238,&l_236,&g_39}},{{&l_236,&l_236,&l_236},{&l_233,&g_237,&g_39},{&g_238,&l_163,(void*)0},{(void*)0,&g_238,&l_299},{&l_299,&g_238,&l_236},{(void*)0,(void*)0,&l_299},{&g_238,&g_2,(void*)0},{&l_233,&l_236,&g_238}}};
+ int i, j, k;
+ l_311.f5 = p_88;
+ g_237 |= (((0xABB76B37L & ((0xAA467251L && l_323) | ((*l_325) = ((l_323 , ((*l_324) = p_88)) ^ p_88)))) < l_306) , (l_311.f6 = (l_326[5][3][0] &= ((*l_325) ^= p_88))));
+ return g_280;
+ }
+ l_328 |= (~l_323);
+ }
+ }
+ else
+ { /* block id: 203 */
+ int32_t l_330 = (-1L);
+ int32_t *l_331 = &l_235;
+ int32_t *l_332 = &g_39;
+ int32_t *l_333 = &g_238;
+ int32_t *l_334 = (void*)0;
+ int32_t *l_335 = &l_235;
+ int32_t *l_336 = &l_235;
+ int32_t *l_337 = &l_236;
+ int32_t *l_338 = &l_329;
+ int32_t *l_339[9];
+ int i;
+ for (i = 0; i < 9; i++)
+ l_339[i] = &g_237;
+ ++g_347;
+ }
+ }
+ for (l_236 = (-7); (l_236 < (-27)); l_236 = safe_sub_func_int16_t_s_s(l_236, 6))
+ { /* block id: 209 */
+ int32_t l_368 = 0xAE9026B3L;
+ uint32_t l_369 = 0xF0C741AFL;
+ uint8_t *l_370 = &l_285;
+ int32_t l_397 = 0L;
+ struct S1 l_398 = {3,768,1037,163,753,24,-442,139,64,9UL};
+ uint16_t l_411 = 65534UL;
+ uint16_t l_438 = 65528UL;
+ uint32_t l_486 = 0xC4A867A1L;
+ for (g_347 = 0; (g_347 > 19); g_347 = safe_add_func_uint8_t_u_u(g_347, 1))
+ { /* block id: 212 */
+ int16_t l_359 = 0xF62AL;
+ int32_t l_360[5][9][5] = {{{0x9DF86A6FL,0x95036420L,0x166F187FL,0x696BFCAAL,0x696BFCAAL},{1L,(-1L),1L,0x27CAFC2EL,1L},{0x94B78765L,0x9DF86A6FL,0x4426EC2FL,0x4E8F0221L,7L},{0xD0B67DE8L,0xEF7070EBL,1L,0L,0xF0132B51L},{0x9AFEC63DL,0x166F187FL,0x4426EC2FL,7L,(-9L)},{0L,1L,1L,1L,0L},{0xBC3A7848L,0x6A9B86FFL,0x166F187FL,0xF529EB06L,0x166F187FL},{0x27CAFC2EL,0x27CAFC2EL,(-3L),0x47BB2F77L,(-1L)},{0xDC3195D9L,(-1L),1L,0x94B78765L,(-1L)}},{{7L,0L,1L,0xC021C2B8L,0x47BB2F77L},{0x86921A87L,0x95036420L,(-1L),0x29DEC1BEL,0x6A9B86FFL},{0xEF7070EBL,0xD0B67DE8L,(-1L),(-3L),0x845B019AL},{(-1L),(-1L),0x9AFEC63DL,0x9AFEC63DL,(-1L)},{0L,0xC021C2B8L,0L,7L,1L},{0xBC3A7848L,0xDC3195D9L,0x8D604015L,0x6A9B86FFL,0x9AFEC63DL},{1L,(-1L),(-9L),(-1L),0xFFED5E11L},{0xBC3A7848L,0x4E8F0221L,8L,0x95036420L,1L},{0L,0L,0xF0132B51L,0x27CAFC2EL,7L}},{{(-1L),0x86921A87L,(-1L),0x86921A87L,(-1L)},{0xEF7070EBL,(-1L),0x27CAFC2EL,0x47BB2F77L,0xD0B67DE8L},{0x86921A87L,(-9L),7L,0x4426EC2FL,0x166F187FL},{(-1L),0xFFED5E11L,1L,(-1L),0xD0B67DE8L},{0xF529EB06L,0x4426EC2FL,0x94B78765L,0x696BFCAAL,(-1L)},{0xD0B67DE8L,(-1L),(-3L),0x845B019AL,7L},{0x8D604015L,0xA1B0B983L,0xA1B0B983L,0x8D604015L,1L},{0x27CAFC2EL,0xEBE5C5FEL,(-1L),0L,0xFFED5E11L},{0x166F187FL,0xBC3A7848L,0x86921A87L,6L,0x9AFEC63DL}},{{0x845B019AL,(-1L),7L,0L,1L},{0xA1B0B983L,0x4426EC2FL,(-9L),0x166F187FL,0x4E8F0221L},{0L,(-1L),(-1L),0x47BB2F77L,0x47BB2F77L},{0xA595A854L,6L,0xA595A854L,7L,0x9DF86A6FL},{0xD0B67DE8L,0L,0xFFED5E11L,0xEBE5C5FEL,0L},{(-1L),0xF529EB06L,0x9DF86A6FL,(-1L),0xC03EEE59L},{0xEF7070EBL,(-1L),0xFFED5E11L,0L,0xF0132B51L},{0xA1B0B983L,0x9DF86A6FL,0xA595A854L,(-9L),(-1L)},{0L,(-1L),(-1L),(-1L),(-1L)}},{{7L,7L,(-9L),0x29DEC1BEL,(-1L)},{0L,7L,1L,0xD0B67DE8L,(-1L)},{0x6A9B86FFL,8L,(-9L),0x9DF86A6FL,1L},{(-1L),7L,0L,1L,1L},{0xDC3195D9L,7L,0x696BFCAAL,0x8D604015L,(-1L)},{0L,(-1L),1L,1L,(-1L)},{0xC03EEE59L,0x9DF86A6FL,8L,0x86921A87L,(-9L)},{(-3L),(-1L),0L,1L,1L},{(-1L),0xF529EB06L,0x256ADFB4L,0x696BFCAAL,0x9AFEC63DL}}};
+ struct S0 l_364 = {0UL,3L,0xA013L,0UL,6UL};
+ int i, j, k;
+ for (l_235 = 0; (l_235 == (-7)); l_235--)
+ { /* block id: 215 */
+ uint8_t l_361 = 0x8AL;
+ for (g_71 = 18; (g_71 >= 25); g_71 = safe_add_func_int32_t_s_s(g_71, 4))
+ { /* block id: 218 */
+ int32_t *l_358[9] = {&l_340,&l_340,&l_340,&l_340,&l_340,&l_340,&l_340,&l_340,&l_340};
+ int32_t ***l_367[10][6][4] = {{{&g_365,&g_365,&g_365,(void*)0},{&g_365,&g_365,&g_365,&g_365},{&g_365,&g_365,(void*)0,&g_365},{&g_365,(void*)0,(void*)0,&g_365},{&g_365,&g_365,&g_365,&g_365},{&g_365,&g_365,(void*)0,(void*)0}},{{&g_365,&g_365,(void*)0,&g_365},{&g_365,&g_365,&g_365,&g_365},{&g_365,(void*)0,&g_365,(void*)0},{&g_365,&g_365,&g_365,&g_365},{&g_365,(void*)0,&g_365,&g_365},{&g_365,&g_365,&g_365,&g_365}},{{(void*)0,&g_365,&g_365,&g_365},{&g_365,&g_365,&g_365,&g_365},{&g_365,(void*)0,(void*)0,&g_365},{&g_365,&g_365,&g_365,(void*)0},{&g_365,(void*)0,(void*)0,&g_365},{&g_365,&g_365,&g_365,&g_365}},{{&g_365,&g_365,&g_365,(void*)0},{&g_365,&g_365,(void*)0,&g_365},{&g_365,&g_365,(void*)0,&g_365},{&g_365,(void*)0,&g_365,&g_365},{&g_365,&g_365,&g_365,&g_365},{&g_365,&g_365,(void*)0,(void*)0}},{{&g_365,&g_365,&g_365,&g_365},{&g_365,&g_365,&g_365,&g_365},{&g_365,&g_365,(void*)0,&g_365},{&g_365,&g_365,&g_365,(void*)0},{&g_365,&g_365,(void*)0,&g_365},{&g_365,&g_365,&g_365,&g_365}},{{(void*)0,&g_365,&g_365,&g_365},{&g_365,&g_365,&g_365,&g_365},{&g_365,&g_365,&g_365,&g_365},{(void*)0,&g_365,&g_365,&g_365},{(void*)0,&g_365,&g_365,&g_365},{&g_365,(void*)0,(void*)0,&g_365}},{{&g_365,&g_365,&g_365,&g_365},{(void*)0,&g_365,&g_365,&g_365},{(void*)0,&g_365,&g_365,&g_365},{&g_365,&g_365,&g_365,&g_365},{&g_365,&g_365,&g_365,&g_365},{(void*)0,&g_365,&g_365,&g_365}},{{&g_365,&g_365,(void*)0,&g_365},{&g_365,&g_365,&g_365,&g_365},{&g_365,&g_365,(void*)0,&g_365},{&g_365,&g_365,&g_365,&g_365},{&g_365,&g_365,&g_365,&g_365},{&g_365,&g_365,&g_365,&g_365}},{{&g_365,&g_365,&g_365,&g_365},{(void*)0,&g_365,&g_365,&g_365},{&g_365,&g_365,&g_365,&g_365},{&g_365,&g_365,&g_365,&g_365},{&g_365,&g_365,&g_365,&g_365},{(void*)0,&g_365,&g_365,&g_365}},{{&g_365,&g_365,&g_365,&g_365},{&g_365,&g_365,(void*)0,(void*)0},{&g_365,&g_365,&g_365,&g_365},{&g_365,&g_365,&g_365,&g_365},{&g_365,&g_365,&g_365,&g_365},{&g_365,&g_365,&g_365,&g_365}}};
+ int i, j, k;
+ g_238 |= p_88;
+ ++l_361;
+ g_365 = (l_364 , g_365);
+ }
+ }
+ for (g_241 = 0; (g_241 <= 6); g_241 += 1)
+ { /* block id: 226 */
+ for (l_102 = 0; (l_102 <= 6); l_102 += 1)
+ { /* block id: 229 */
+ int i, j;
+ if (g_36[(l_102 + 1)])
+ break;
+ l_368 &= l_346[l_102][g_241];
+ if (l_346[l_102][g_241])
+ continue;
+ }
+ }
+ }
+ if (((((((((*l_370) = (l_369 = l_285)) > (l_311.f1 = ((++(*l_101)) , 255UL))) && (safe_rshift_func_uint8_t_u_u(((safe_mul_func_int8_t_s_s(0x57L, l_377)) != l_341), p_88))) >= ((safe_sub_func_int8_t_s_s((safe_div_func_uint16_t_u_u((safe_mul_func_uint16_t_u_u((g_282++), p_88)), 0x055CL)), (((((l_344 != p_88) , 1UL) , p_88) == g_82.f4) == g_18.f2))) && 0L)) && l_386) != (-4L)) , p_88))
+ { /* block id: 241 */
+ struct S0 *l_387 = &g_82;
+ int32_t *l_394 = &g_281;
+ int32_t l_399 = 0x4D4B183AL;
+ struct S1 **l_405 = &g_390;
+ for (g_18.f4 = 0; (g_18.f4 <= 6); g_18.f4 += 1)
+ { /* block id: 244 */
+ struct S0 **l_388 = (void*)0;
+ struct S0 **l_389 = &l_387;
+ int i, j;
+ (*l_389) = l_387;
+ g_390 = g_390;
+ if (l_346[g_18.f4][g_18.f4])
+ break;
+ }
+ for (l_109 = 0; (l_109 <= 7); l_109 += 1)
+ { /* block id: 251 */
+ int16_t *l_400 = (void*)0;
+ int16_t *l_401 = &l_102;
+ int32_t *l_402 = &g_237;
+ int32_t *l_403 = &l_235;
+ int i;
+ for (g_39 = 8; (g_39 >= 3); g_39 -= 1)
+ { /* block id: 254 */
+ int i;
+ return g_36[l_109];
+ }
+ (*l_403) = ((*l_402) = ((g_36[l_109] && (g_36[l_109] ^ (g_240 > ((((*l_401) = (((safe_mod_func_uint32_t_u_u((((((*g_365) = &l_306) != l_394) || (safe_sub_func_int8_t_s_s((l_397 | (l_398 , (p_88 != p_88))), l_399))) <= 0x84L), 4294967295UL)) >= p_88) , l_369)) > 65529UL) < p_88)))) , p_88));
+ }
+ (*l_405) = l_404;
+ }
+ else
+ { /* block id: 263 */
+ int32_t *l_406[1][5][7] = {{{&l_368,&l_299,&l_299,&l_368,&l_299,&l_299,&l_368},{&l_299,&l_368,&l_299,&l_299,&l_368,&l_299,&l_299},{&l_368,&l_368,&l_368,&l_368,&l_368,&l_368,&l_368},{&l_368,&l_299,&l_299,&l_368,&l_299,&l_299,&l_368},{&l_299,&l_368,&l_299,&l_299,&l_368,&l_299,&l_299}}};
+ struct S0 l_468 = {0x0EDE6D6DL,0L,65528UL,0x4463L,0x0FL};
+ int i, j, k;
+ g_408--;
+ --l_411;
+ if ((safe_rshift_func_int8_t_s_s(0xF8L, l_340)))
+ { /* block id: 266 */
+ uint32_t l_426[4][9] = {{0x88400371L,0UL,1UL,3UL,4294967295UL,3UL,1UL,0UL,0x88400371L},{0x470FF04AL,0x74C575B2L,0xEF5E38AEL,1UL,0x457E5FE2L,0x08800094L,0UL,0x08800094L,4294967295UL},{0xEF5E38AEL,0UL,0UL,0xEF5E38AEL,0x03ED131BL,0x9A6CC948L,0x88400371L,4294967295UL,0x457E5FE2L},{0UL,4294967295UL,0UL,0x74C575B2L,0x74C575B2L,0UL,4294967295UL,0UL,3UL}};
+ int32_t l_431[6];
+ int i, j;
+ for (i = 0; i < 6; i++)
+ l_431[i] = 0x9A6743CEL;
+ (*g_220) = ((p_88 , p_88) , (*g_220));
+ if (p_88)
+ { /* block id: 268 */
+ int32_t l_430 = 0x675E34E6L;
+ int32_t l_432 = 0xD3699B92L;
+ l_430 &= (4294967295UL || (l_235 = (safe_add_func_int16_t_s_s(((safe_div_func_int32_t_s_s(((((safe_mod_func_uint16_t_u_u((safe_add_func_uint32_t_u_u(0x4C38B039L, p_88)), ((*l_101) |= g_391.f4))) < g_18.f4) || (safe_rshift_func_uint8_t_u_s(((*l_370) |= l_426[1][2]), l_427))) && p_88), (safe_mul_func_int16_t_s_s(l_311.f7, l_344)))) <= g_391.f9), 0xE822L))));
+ --l_435;
+ g_238 = l_346[6][7];
+ }
+ else
+ { /* block id: 275 */
+ (*g_220) = (void*)0;
+ }
+ g_39 = (p_88 == (l_438 <= (l_398.f8 & l_439)));
+ if (l_377)
+ break;
+ }
+ else
+ { /* block id: 280 */
+ uint8_t l_459 = 0x18L;
+ const int32_t l_469 = 0x91247D0DL;
+ int32_t l_483 = 0x6A87FF15L;
+ int32_t l_496 = 0xDE6CCBD7L;
+ int32_t l_497 = 0xDBFCC0BBL;
+ int32_t l_498 = 1L;
+ for (g_222 = 0; (g_222 != 11); g_222++)
+ { /* block id: 283 */
+ int8_t l_446 = 0x78L;
+ int32_t l_455 = 0x838E2474L;
+ l_455 |= (safe_sub_func_uint16_t_u_u(g_18.f1, (l_446 > (((safe_mod_func_int32_t_s_s(l_449, (l_427 = ((safe_lshift_func_int16_t_s_s(((l_235 = (-9L)) | 0x39081B19L), 2)) , (safe_lshift_func_int16_t_s_u(l_454, 13)))))) , &l_449) != ((*l_268) = ((*l_404) , l_370))))));
+ return p_88;
+ }
+ if (l_398.f4)
+ { /* block id: 290 */
+ struct S0 *l_457 = &l_124[6][0];
+ struct S0 **l_456 = &l_457;
+ int32_t l_458 = 0x418B64C8L;
+ (*l_456) = &g_18;
+ if (l_346[6][6])
+ continue;
+ ++l_459;
+ }
+ else
+ { /* block id: 294 */
+ int16_t l_472 = (-3L);
+ uint32_t *l_475 = &g_347;
+ l_483 = ((safe_lshift_func_uint8_t_u_u((safe_rshift_func_uint16_t_u_u(l_459, (p_88 || ((safe_rshift_func_uint8_t_u_s((l_468 , l_469), 6)) >= p_88)))), (safe_rshift_func_int8_t_s_u((((l_472 != (safe_div_func_uint32_t_u_u(((*l_475)--), (0x0376L && (g_71 = (safe_rshift_func_int8_t_s_s((safe_mod_func_int16_t_s_s(l_340, (l_341 = 2L))), 6))))))) & l_482) , (-1L)), 4)))) >= 0x7FL);
+ if (p_88)
+ break;
+ return p_88;
+ }
+ for (g_208 = (-24); (g_208 != 13); g_208 = safe_add_func_int32_t_s_s(g_208, 6))
+ { /* block id: 304 */
+ int32_t l_494[6][4] = {{0x899E298AL,(-3L),1L,0x5B286B25L},{0x899E298AL,1L,0x899E298AL,0xFE2F18EAL},{(-3L),0x5B286B25L,0xFE2F18EAL,0xFE2F18EAL},{1L,1L,2L,0x5B286B25L},{0x5B286B25L,(-3L),2L,(-3L)},{1L,0x899E298AL,0xFE2F18EAL,2L}};
+ int32_t l_495[9] = {0x708011CBL,0x708011CBL,0x708011CBL,0x708011CBL,0x708011CBL,0x708011CBL,0x708011CBL,0x708011CBL,0x708011CBL};
+ int i, j;
+ g_238 = (p_88 > ((p_88 ^ (l_346[0][4] | (l_449 || ((l_486 , (safe_add_func_int32_t_s_s(p_88, (((safe_div_func_uint32_t_u_u(0x786AA2D0L, ((safe_add_func_int8_t_s_s((&g_251 == (void*)0), p_88)) & 1L))) , l_483) < 4294967292UL)))) , l_493)))) < l_469));
+ ++g_501;
+ }
+ if (l_398.f8)
+ goto lbl_504;
+ }
+ l_346[0][2] = (g_119 ^ 4294967295UL);
+ }
+ }
+ l_507[0] = &g_18;
+ for (g_2 = 0; (g_2 >= (-22)); g_2 = safe_sub_func_int16_t_s_s(g_2, 1))
+ { /* block id: 316 */
+ uint32_t l_518[6] = {0UL,0UL,0UL,0UL,0UL,0UL};
+ int32_t l_527 = (-10L);
+ int32_t l_538 = (-3L);
+ int32_t l_539 = (-3L);
+ int32_t l_552[7][7][5] = {{{0xDD201F80L,8L,0xEBE46D86L,8L,0xDD201F80L},{0L,1L,0x4F27EFA9L,(-4L),(-4L)},{0x3ECFA0B6L,8L,0x3ECFA0B6L,0x023C9910L,0x3ECFA0B6L},{0L,(-4L),1L,1L,(-4L)},{0xDD201F80L,0x023C9910L,0xEBE46D86L,0x023C9910L,0xDD201F80L},{(-4L),1L,1L,(-4L),0L},{0x3ECFA0B6L,0x023C9910L,0x3ECFA0B6L,8L,0x3ECFA0B6L}},{{(-4L),(-4L),0x4F27EFA9L,1L,0L},{0xDD201F80L,8L,0xEBE46D86L,8L,0xDD201F80L},{0L,1L,0x4F27EFA9L,(-4L),(-4L)},{0x3ECFA0B6L,8L,0x3ECFA0B6L,0x023C9910L,0x3ECFA0B6L},{0L,(-4L),1L,1L,(-4L)},{0xDD201F80L,0x023C9910L,0xEBE46D86L,0x023C9910L,0xDD201F80L},{(-4L),1L,1L,(-4L),0L}},{{0x3ECFA0B6L,0x023C9910L,0x3ECFA0B6L,8L,0x3ECFA0B6L},{(-4L),(-4L),0x4F27EFA9L,1L,0L},{0xDD201F80L,8L,0xEBE46D86L,8L,0xDD201F80L},{0L,1L,0x4F27EFA9L,(-4L),(-4L)},{0x3ECFA0B6L,8L,0x3ECFA0B6L,0x023C9910L,0x3ECFA0B6L},{0L,(-4L),1L,1L,(-4L)},{0xDD201F80L,0x023C9910L,0xEBE46D86L,0x023C9910L,0xDD201F80L}},{{(-4L),1L,1L,(-4L),0L},{0x3ECFA0B6L,0x023C9910L,0x3ECFA0B6L,8L,0x3ECFA0B6L},{(-4L),(-4L),0x4F27EFA9L,1L,0L},{0xDD201F80L,8L,0xEBE46D86L,8L,0xDD201F80L},{0L,1L,0x4F27EFA9L,(-4L),(-4L)},{0x3ECFA0B6L,8L,0x3ECFA0B6L,0x023C9910L,0x3ECFA0B6L},{0L,(-4L),1L,1L,(-4L)}},{{0xDD201F80L,0x023C9910L,0xEBE46D86L,0x023C9910L,0xDD201F80L},{(-4L),1L,1L,(-4L),0L},{0x3ECFA0B6L,0x023C9910L,0x3ECFA0B6L,8L,0x3ECFA0B6L},{(-4L),(-4L),0x4F27EFA9L,1L,0L},{0xDD201F80L,8L,0xEBE46D86L,8L,0xDD201F80L},{0L,1L,0x4F27EFA9L,(-4L),(-4L)},{0x3ECFA0B6L,8L,0x3ECFA0B6L,0x023C9910L,0x3ECFA0B6L}},{{0L,(-4L),1L,1L,(-4L)},{0xDD201F80L,0x023C9910L,0xEBE46D86L,0x023C9910L,0xDD201F80L},{(-4L),1L,1L,(-4L),0L},{0x3ECFA0B6L,0x023C9910L,0x3ECFA0B6L,8L,0x3ECFA0B6L},{(-4L),(-4L),0x4F27EFA9L,1L,0L},{0xDD201F80L,8L,0xEBE46D86L,8L,0xDD201F80L},{0L,1L,0x4F27EFA9L,(-4L),(-4L)}},{{0x3ECFA0B6L,8L,0x3ECFA0B6L,0x023C9910L,0x3ECFA0B6L},{0L,(-4L),1L,1L,(-4L)},{0xDD201F80L,0x023C9910L,0xEBE46D86L,0x023C9910L,0xDD201F80L},{(-4L),1L,1L,(-4L),0L},{0x3ECFA0B6L,0x023C9910L,0x3ECFA0B6L,8L,0x3ECFA0B6L},{(-4L),(-4L),0x4F27EFA9L,1L,0L},{0xDD201F80L,8L,0xEBE46D86L,8L,0xDD201F80L}}};
+ int i, j, k;
+ }
+ }
+ return g_508[3][3][4].f0;
+}
+
+
+
+
+/* ---------------------------------------- */
+int main (int argc, char* argv[])
+{
+ int i, j, k;
+ int print_hash_value = 0;
+ if (argc == 2 && strcmp(argv[1], "1") == 0) print_hash_value = 1;
+ platform_main_begin();
+ crc32_gentab();
+ func_1();
+ transparent_crc(g_2, "g_2", print_hash_value);
+ transparent_crc(g_5, "g_5", print_hash_value);
+ transparent_crc(g_18.f0, "g_18.f0", print_hash_value);
+ transparent_crc(g_18.f1, "g_18.f1", print_hash_value);
+ transparent_crc(g_18.f2, "g_18.f2", print_hash_value);
+ transparent_crc(g_18.f3, "g_18.f3", print_hash_value);
+ transparent_crc(g_18.f4, "g_18.f4", print_hash_value);
+ for (i = 0; i < 8; i++)
+ {
+ transparent_crc(g_36[i], "g_36[i]", print_hash_value);
+ if (print_hash_value) printf("index = [%d]\n", i);
+
+ }
+ transparent_crc(g_39, "g_39", print_hash_value);
+ transparent_crc(g_40, "g_40", print_hash_value);
+ transparent_crc(g_71, "g_71", print_hash_value);
+ transparent_crc(g_79, "g_79", print_hash_value);
+ transparent_crc(g_82.f0, "g_82.f0", print_hash_value);
+ transparent_crc(g_82.f1, "g_82.f1", print_hash_value);
+ transparent_crc(g_82.f2, "g_82.f2", print_hash_value);
+ transparent_crc(g_82.f3, "g_82.f3", print_hash_value);
+ transparent_crc(g_82.f4, "g_82.f4", print_hash_value);
+ transparent_crc(g_119, "g_119", print_hash_value);
+ transparent_crc(g_195, "g_195", print_hash_value);
+ transparent_crc(g_208, "g_208", print_hash_value);
+ transparent_crc(g_209, "g_209", print_hash_value);
+ transparent_crc(g_222, "g_222", print_hash_value);
+ transparent_crc(g_237, "g_237", print_hash_value);
+ transparent_crc(g_238, "g_238", print_hash_value);
+ transparent_crc(g_240, "g_240", print_hash_value);
+ transparent_crc(g_241, "g_241", print_hash_value);
+ transparent_crc(g_251, "g_251", print_hash_value);
+ transparent_crc(g_279, "g_279", print_hash_value);
+ transparent_crc(g_280, "g_280", print_hash_value);
+ transparent_crc(g_281, "g_281", print_hash_value);
+ transparent_crc(g_282, "g_282", print_hash_value);
+ transparent_crc(g_347, "g_347", print_hash_value);
+ transparent_crc(g_391.f0, "g_391.f0", print_hash_value);
+ transparent_crc(g_391.f1, "g_391.f1", print_hash_value);
+ transparent_crc(g_391.f2, "g_391.f2", print_hash_value);
+ transparent_crc(g_391.f3, "g_391.f3", print_hash_value);
+ transparent_crc(g_391.f4, "g_391.f4", print_hash_value);
+ transparent_crc(g_391.f5, "g_391.f5", print_hash_value);
+ transparent_crc(g_391.f6, "g_391.f6", print_hash_value);
+ transparent_crc(g_391.f7, "g_391.f7", print_hash_value);
+ transparent_crc(g_391.f8, "g_391.f8", print_hash_value);
+ transparent_crc(g_391.f9, "g_391.f9", print_hash_value);
+ transparent_crc(g_408, "g_408", print_hash_value);
+ transparent_crc(g_433, "g_433", print_hash_value);
+ transparent_crc(g_434, "g_434", print_hash_value);
+ for (i = 0; i < 3; i++)
+ {
+ for (j = 0; j < 1; j++)
+ {
+ transparent_crc(g_499[i][j], "g_499[i][j]", print_hash_value);
+ if (print_hash_value) printf("index = [%d][%d]\n", i, j);
+
+ }
+ }
+ transparent_crc(g_500, "g_500", print_hash_value);
+ transparent_crc(g_501, "g_501", print_hash_value);
+ for (i = 0; i < 9; i++)
+ {
+ for (j = 0; j < 4; j++)
+ {
+ for (k = 0; k < 7; k++)
+ {
+ transparent_crc(g_508[i][j][k].f0, "g_508[i][j][k].f0", print_hash_value);
+ transparent_crc(g_508[i][j][k].f1, "g_508[i][j][k].f1", print_hash_value);
+ transparent_crc(g_508[i][j][k].f2, "g_508[i][j][k].f2", print_hash_value);
+ transparent_crc(g_508[i][j][k].f3, "g_508[i][j][k].f3", print_hash_value);
+ transparent_crc(g_508[i][j][k].f4, "g_508[i][j][k].f4", print_hash_value);
+ if (print_hash_value) printf("index = [%d][%d][%d]\n", i, j, k);
+
+ }
+ }
+ }
+ for (i = 0; i < 3; i++)
+ {
+ transparent_crc(g_537[i], "g_537[i]", print_hash_value);
+ if (print_hash_value) printf("index = [%d]\n", i);
+
+ }
+ transparent_crc(g_540, "g_540", print_hash_value);
+ transparent_crc(g_541, "g_541", print_hash_value);
+ transparent_crc(g_542, "g_542", print_hash_value);
+ transparent_crc(g_553, "g_553", print_hash_value);
+ for (i = 0; i < 1; i++)
+ {
+ for (j = 0; j < 2; j++)
+ {
+ transparent_crc(g_555[i][j], "g_555[i][j]", print_hash_value);
+ if (print_hash_value) printf("index = [%d][%d]\n", i, j);
+
+ }
+ }
+ transparent_crc(g_564, "g_564", print_hash_value);
+ transparent_crc(g_802, "g_802", print_hash_value);
+ for (i = 0; i < 5; i++)
+ {
+ for (j = 0; j < 1; j++)
+ {
+ for (k = 0; k < 8; k++)
+ {
+ transparent_crc(g_809[i][j][k], "g_809[i][j][k]", print_hash_value);
+ if (print_hash_value) printf("index = [%d][%d][%d]\n", i, j, k);
+
+ }
+ }
+ }
+ transparent_crc(g_876, "g_876", print_hash_value);
+ transparent_crc(g_910, "g_910", print_hash_value);
+ transparent_crc(g_1052, "g_1052", print_hash_value);
+ for (i = 0; i < 9; i++)
+ {
+ transparent_crc(g_1105[i], "g_1105[i]", print_hash_value);
+ if (print_hash_value) printf("index = [%d]\n", i);
+
+ }
+ transparent_crc(g_1109, "g_1109", print_hash_value);
+ transparent_crc(g_1113.f0, "g_1113.f0", print_hash_value);
+ transparent_crc(g_1113.f1, "g_1113.f1", print_hash_value);
+ transparent_crc(g_1113.f2, "g_1113.f2", print_hash_value);
+ transparent_crc(g_1113.f3, "g_1113.f3", print_hash_value);
+ transparent_crc(g_1113.f4, "g_1113.f4", print_hash_value);
+ transparent_crc(g_1113.f5, "g_1113.f5", print_hash_value);
+ transparent_crc(g_1113.f6, "g_1113.f6", print_hash_value);
+ transparent_crc(g_1113.f7, "g_1113.f7", print_hash_value);
+ transparent_crc(g_1113.f8, "g_1113.f8", print_hash_value);
+ transparent_crc(g_1113.f9, "g_1113.f9", print_hash_value);
+ transparent_crc(g_1169.f0, "g_1169.f0", print_hash_value);
+ transparent_crc(g_1169.f1, "g_1169.f1", print_hash_value);
+ transparent_crc(g_1169.f2, "g_1169.f2", print_hash_value);
+ transparent_crc(g_1169.f3, "g_1169.f3", print_hash_value);
+ transparent_crc(g_1169.f4, "g_1169.f4", print_hash_value);
+ for (i = 0; i < 1; i++)
+ {
+ for (j = 0; j < 8; j++)
+ {
+ transparent_crc(g_1192[i][j], "g_1192[i][j]", print_hash_value);
+ if (print_hash_value) printf("index = [%d][%d]\n", i, j);
+
+ }
+ }
+ for (i = 0; i < 8; i++)
+ {
+ transparent_crc(g_1233[i], "g_1233[i]", print_hash_value);
+ if (print_hash_value) printf("index = [%d]\n", i);
+
+ }
+ transparent_crc(g_1263, "g_1263", print_hash_value);
+ transparent_crc(g_1389, "g_1389", print_hash_value);
+ platform_main_end(crc32_context ^ 0xFFFFFFFFUL, print_hash_value);
+ return 0;
+}
+
+/************************ statistics *************************
+XXX max struct depth: 1
+breakdown:
+ depth: 0, occurrence: 476
+ depth: 1, occurrence: 23
+XXX total union variables: 0
+
+XXX non-zero bitfields defined in structs: 9
+XXX zero bitfields defined in structs: 0
+XXX const bitfields defined in structs: 1
+XXX volatile bitfields defined in structs: 0
+XXX structs with bitfields in the program: 26
+breakdown:
+ indirect level: 0, occurrence: 12
+ indirect level: 1, occurrence: 9
+ indirect level: 2, occurrence: 4
+ indirect level: 3, occurrence: 1
+XXX full-bitfields structs in the program: 0
+breakdown:
+XXX times a bitfields struct's address is taken: 22
+XXX times a bitfields struct on LHS: 0
+XXX times a bitfields struct on RHS: 19
+XXX times a single bitfield on LHS: 7
+XXX times a single bitfield on RHS: 26
+
+XXX max expression depth: 49
+breakdown:
+ depth: 1, occurrence: 388
+ depth: 2, occurrence: 107
+ depth: 3, occurrence: 10
+ depth: 4, occurrence: 7
+ depth: 5, occurrence: 4
+ depth: 6, occurrence: 3
+ depth: 7, occurrence: 1
+ depth: 8, occurrence: 1
+ depth: 9, occurrence: 2
+ depth: 10, occurrence: 1
+ depth: 11, occurrence: 3
+ depth: 12, occurrence: 1
+ depth: 13, occurrence: 3
+ depth: 14, occurrence: 3
+ depth: 15, occurrence: 4
+ depth: 16, occurrence: 5
+ depth: 17, occurrence: 2
+ depth: 18, occurrence: 3
+ depth: 19, occurrence: 2
+ depth: 20, occurrence: 4
+ depth: 22, occurrence: 2
+ depth: 23, occurrence: 2
+ depth: 25, occurrence: 2
+ depth: 27, occurrence: 1
+ depth: 28, occurrence: 1
+ depth: 29, occurrence: 2
+ depth: 31, occurrence: 1
+ depth: 32, occurrence: 2
+ depth: 33, occurrence: 1
+ depth: 35, occurrence: 1
+ depth: 37, occurrence: 1
+ depth: 49, occurrence: 1
+
+XXX total number of pointers: 386
+
+XXX times a variable address is taken: 972
+XXX times a pointer is dereferenced on RHS: 166
+breakdown:
+ depth: 1, occurrence: 159
+ depth: 2, occurrence: 7
+XXX times a pointer is dereferenced on LHS: 233
+breakdown:
+ depth: 1, occurrence: 230
+ depth: 2, occurrence: 3
+XXX times a pointer is compared with null: 15
+XXX times a pointer is compared with address of another variable: 6
+XXX times a pointer is compared with another pointer: 15
+XXX times a pointer is qualified to be dereferenced: 7549
+
+XXX max dereference level: 4
+breakdown:
+ level: 0, occurrence: 0
+ level: 1, occurrence: 2327
+ level: 2, occurrence: 127
+ level: 3, occurrence: 3
+ level: 4, occurrence: 4
+XXX number of pointers point to pointers: 107
+XXX number of pointers point to scalars: 257
+XXX number of pointers point to structs: 22
+XXX percent of pointers has null in alias set: 32.4
+XXX average alias set size: 1.65
+
+XXX times a non-volatile is read: 1305
+XXX times a non-volatile is write: 763
+XXX times a volatile is read: 0
+XXX times read thru a pointer: 0
+XXX times a volatile is write: 0
+XXX times written thru a pointer: 0
+XXX times a volatile is available for access: 0
+XXX percentage of non-volatile access: 100
+
+XXX forward jumps: 2
+XXX backward jumps: 8
+
+XXX stmts: 376
+XXX max block depth: 5
+breakdown:
+ depth: 0, occurrence: 34
+ depth: 1, occurrence: 38
+ depth: 2, occurrence: 35
+ depth: 3, occurrence: 67
+ depth: 4, occurrence: 91
+ depth: 5, occurrence: 111
+
+XXX percentage a fresh-made variable is used: 17.1
+XXX percentage an existing variable is used: 82.9
+FYI: the random generator makes assumptions about the integer size. See platform.info for more details.
+********************* end of statistics **********************/
+
diff --git a/tests/fuzz/2.c.txt b/tests/fuzz/2.c.txt
new file mode 100644
index 00000000..8ca5593f
--- /dev/null
+++ b/tests/fuzz/2.c.txt
@@ -0,0 +1 @@
+checksum = E09CCEB0
diff --git a/tests/fuzz/3.c b/tests/fuzz/3.c
new file mode 100644
index 00000000..b2dcac2e
--- /dev/null
+++ b/tests/fuzz/3.c
@@ -0,0 +1,1043 @@
+/*
+ * This is a RANDOMLY GENERATED PROGRAM.
+ *
+ * Generator: csmith 2.2.0
+ * Git version: 2751ded
+ * Options: --no-volatiles --no-math64
+ * Seed: 1532285979
+ */
+
+#include "csmith.h"
+
+
+static long __undefined;
+
+/* --- Struct/Union Declarations --- */
+union U0 {
+ int8_t f0;
+ const uint8_t f1;
+};
+
+union U1 {
+ int8_t * f0;
+};
+
+union U2 {
+ int32_t f0;
+ uint32_t f1;
+ uint8_t f2;
+ uint32_t f3;
+ int8_t * f4;
+};
+
+/* --- GLOBAL VARIABLES --- */
+static uint8_t g_23 = 0x67L;
+static int32_t g_25 = 1L;
+static uint16_t g_34 = 0x451DL;
+static union U2 g_42 = {-1L};
+static int32_t g_61[8][6][4] = {{{0xE281B1D0L,8L,9L,0xC90ACEFCL},{0xC369029EL,8L,0x63978472L,0x55BBB785L},{0x23D12EF6L,(-1L),0x23D12EF6L,8L},{0x55BBB785L,0xE4FCD58FL,0L,1L},{0xDD4F9520L,0xBF567D71L,0x9117A540L,0xE4FCD58FL},{4L,0L,0x9117A540L,9L}},{{0xDD4F9520L,(-1L),0L,0L},{0x55BBB785L,(-1L),0x23D12EF6L,0xDD4F9520L},{0x23D12EF6L,0xDD4F9520L,0x63978472L,0L},{0xC369029EL,9L,9L,0xC369029EL},{0xE281B1D0L,6L,0x55BBB785L,0x70A6219FL},{0L,0x63978472L,0xE281B1D0L,8L}},{{4L,9L,(-1L),8L},{0x63978472L,1L,0xC90ACEFCL,(-1L)},{0x9117A540L,(-1L),0x63978472L,0xE281B1D0L},{0L,0x9117A540L,0xC35C241EL,0x55F5DDA3L},{0x3A29ADD9L,(-1L),0x5DD88BA5L,(-1L)},{0xE4FCD58FL,8L,9L,0xBF567D71L}},{{0x55BBB785L,0xDD4F9520L,0xBF567D71L,0x9117A540L},{0x55F5DDA3L,0x3A29ADD9L,8L,1L},{0x55F5DDA3L,4L,0xBF567D71L,0x55BBB785L},{0x55BBB785L,1L,9L,0L},{0xE4FCD58FL,0L,0x5DD88BA5L,8L},{0x3A29ADD9L,0x5DD88BA5L,0xC35C241EL,0xC35C241EL}},{{0L,0L,0x63978472L,0xDD4F9520L},{0x9117A540L,6L,0xC90ACEFCL,(-1L)},{0x63978472L,0xC369029EL,(-1L),0xC90ACEFCL},{4L,0xC369029EL,0xE281B1D0L,(-1L)},{0xC369029EL,6L,8L,0xDD4F9520L},{0L,0L,0x9117A540L,0xC35C241EL}},{{0xE281B1D0L,0x5DD88BA5L,1L,8L},{6L,0L,6L,0L},{8L,1L,0x3A29ADD9L,0x55BBB785L},{(-1L),4L,0x70A6219FL,1L},{0x23D12EF6L,0x3A29ADD9L,0x70A6219FL,0x9117A540L},{(-1L),0xBF567D71L,0x55BBB785L,(-1L)}},{{0x9117A540L,0x23D12EF6L,0xE4FCD58FL,4L},{0xE4FCD58FL,4L,0x3A29ADD9L,(-1L)},{0x63978472L,0L,0L,0x63978472L},{1L,1L,0x9117A540L,0L},{0xC35C241EL,0x3A29ADD9L,0x63978472L,0x23D12EF6L},{8L,8L,4L,0x23D12EF6L}},{{0L,0x3A29ADD9L,0xC369029EL,0L},{0L,1L,0L,0x63978472L},{0x70A6219FL,0L,0xE281B1D0L,(-1L)},{0x55BBB785L,4L,6L,4L},{(-1L),0x23D12EF6L,8L,(-1L)},{9L,0xBF567D71L,(-1L),0L}}};
+static int32_t *g_60 = &g_61[3][1][1];
+static int8_t g_70 = 1L;
+static int8_t *g_69 = &g_70;
+static int32_t g_78 = 1L;
+static union U1 g_84 = {0};
+static int32_t **g_95 = &g_60;
+static int32_t ***g_94[1] = {&g_95};
+static int8_t g_117 = 7L;
+static union U0 g_163 = {0xE2L};
+static uint16_t g_165[7] = {0xB953L,0xB953L,0xB953L,0xB953L,0xB953L,0xB953L,0xB953L};
+static const uint8_t g_171[4][8][3] = {{{8UL,8UL,8UL},{1UL,1UL,1UL},{8UL,8UL,8UL},{1UL,1UL,1UL},{8UL,8UL,8UL},{1UL,1UL,1UL},{8UL,8UL,8UL},{1UL,1UL,1UL}},{{8UL,8UL,8UL},{1UL,1UL,1UL},{8UL,8UL,8UL},{1UL,1UL,1UL},{8UL,8UL,8UL},{1UL,1UL,1UL},{8UL,8UL,8UL},{1UL,1UL,1UL}},{{8UL,8UL,8UL},{1UL,1UL,1UL},{8UL,8UL,8UL},{1UL,1UL,1UL},{8UL,8UL,8UL},{1UL,1UL,1UL},{8UL,8UL,8UL},{1UL,1UL,1UL}},{{8UL,8UL,8UL},{1UL,1UL,1UL},{8UL,8UL,8UL},{1UL,1UL,1UL},{8UL,8UL,8UL},{1UL,1UL,1UL},{8UL,8UL,8UL},{1UL,1UL,1UL}}};
+static const uint8_t *g_170 = &g_171[2][3][0];
+static uint8_t g_218 = 0xB9L;
+static int16_t g_234 = 1L;
+static int16_t g_246 = 0x3B2BL;
+static int16_t *g_248 = &g_246;
+static int16_t *g_249 = &g_246;
+static int32_t g_255 = (-8L);
+static int16_t g_380 = 0L;
+static int16_t g_387 = 1L;
+static union U2 *g_397 = &g_42;
+static union U2 **g_396 = &g_397;
+static const int32_t *g_404 = &g_25;
+static union U0 g_405[4][1] = {{{0xD5L}},{{0xD5L}},{{0xD5L}},{{0xD5L}}};
+static int8_t g_471 = (-2L);
+static uint16_t **g_505 = (void*)0;
+static const int32_t g_555 = 0x72195204L;
+static uint16_t g_556[9] = {8UL,0x32E2L,8UL,8UL,0x32E2L,8UL,8UL,0x32E2L,8UL};
+static int32_t *g_588 = &g_61[3][1][2];
+static uint8_t *g_616 = &g_42.f2;
+static union U1 *g_644 = &g_84;
+static union U1 **g_643 = &g_644;
+
+
+/* --- FORWARD DECLARATIONS --- */
+static int32_t func_1(void);
+static uint8_t func_4(int8_t * p_5, uint16_t p_6, int8_t * p_7);
+static int8_t * func_8(uint8_t p_9, const uint32_t p_10, const int8_t * p_11, union U0 p_12);
+static const int8_t func_16(union U0 p_17, uint8_t p_18, int8_t * p_19, int8_t * p_20);
+static union U0 func_21(uint32_t p_22);
+static int8_t func_27(uint16_t p_28, int32_t * p_29, union U2 p_30, int32_t * const p_31, int32_t p_32);
+static int32_t * func_37(const uint16_t p_38, union U2 p_39, int32_t * p_40, int32_t p_41);
+static int32_t * func_43(uint8_t p_44, int8_t p_45, int8_t * p_46);
+static uint16_t func_50(int32_t * p_51, uint16_t p_52, int8_t p_53, int32_t * p_54, union U2 p_55);
+static int32_t * func_56(int8_t * p_57, int32_t * p_58);
+
+
+/* --- FUNCTIONS --- */
+/* ------------------------------------------ */
+/*
+ * reads : g_23 g_34 g_42 g_60 g_61 g_42.f3 g_69 g_70 g_42.f2 g_78 g_94 g_117 g_95 g_163 g_163.f0 g_42.f1 g_218 g_170 g_171 g_163.f1 g_84 g_248 g_246 g_234 g_249 g_405 g_255 g_387 g_25 g_396 g_397 g_380 g_471 g_165 g_404 g_505 g_588 g_643
+ * writes: g_25 g_34 g_60 g_78 g_61 g_117 g_170 g_70 g_163.f0 g_218 g_165 g_234 g_42.f1 g_404 g_255 g_387 g_396 g_471 g_42.f2 g_616
+ */
+static int32_t func_1(void)
+{ /* block id: 0 */
+ int32_t l_13[8] = {1L,1L,1L,1L,1L,1L,1L,1L};
+ uint16_t *l_33 = &g_34;
+ uint32_t l_47 = 0xF844BA92L;
+ int8_t *l_59 = (void*)0;
+ union U2 l_64 = {-8L};
+ int32_t l_175[3][5] = {{0xEB591F11L,0xEB591F11L,(-9L),4L,0xE9867546L},{(-1L),1L,1L,(-1L),0xEB591F11L},{(-1L),4L,0L,0L,4L}};
+ int32_t l_509[9][6] = {{0xDF92247FL,0x59DF3EF6L,0x59DF3EF6L,0xDF92247FL,0x59DF3EF6L,0x59DF3EF6L},{0xDF92247FL,0x59DF3EF6L,0x59DF3EF6L,0xDF92247FL,0x59DF3EF6L,0x59DF3EF6L},{0xDF92247FL,0x59DF3EF6L,0x59DF3EF6L,0xDF92247FL,0x59DF3EF6L,0x59DF3EF6L},{0xDF92247FL,0x59DF3EF6L,0x59DF3EF6L,0xDF92247FL,0x59DF3EF6L,0x59DF3EF6L},{0xDF92247FL,0x59DF3EF6L,0x59DF3EF6L,0xDF92247FL,0x59DF3EF6L,0x59DF3EF6L},{0xDF92247FL,0x59DF3EF6L,0x59DF3EF6L,0xDF92247FL,0x59DF3EF6L,0x59DF3EF6L},{0xDF92247FL,0x59DF3EF6L,0x59DF3EF6L,0xDF92247FL,0x59DF3EF6L,0x59DF3EF6L},{0xDF92247FL,0x59DF3EF6L,0x59DF3EF6L,0xDF92247FL,0x59DF3EF6L,0x59DF3EF6L},{0xDF92247FL,0x59DF3EF6L,0x59DF3EF6L,0xDF92247FL,0x59DF3EF6L,0x59DF3EF6L}};
+ uint32_t l_528 = 6UL;
+ uint8_t *l_576[8] = {&g_23,&g_23,&g_23,&g_23,&g_23,&g_23,&g_23,&g_23};
+ int32_t l_635 = 0x6AE51A9FL;
+ int i, j;
+ if (((safe_add_func_uint16_t_u_u((l_509[1][5] ^= (func_4(func_8(l_13[7], (((safe_mul_func_uint8_t_u_u((func_16(func_21(g_23), (((*g_69) = func_27((++(*l_33)), func_37(l_13[7], g_42, func_43(l_47, (safe_div_func_uint8_t_u_u((func_50(func_56(l_59, g_60), g_61[6][5][1], l_13[2], &g_61[3][1][1], l_64) <= l_64.f1), g_42.f3)), g_69), l_47), l_64, &l_13[1], l_175[0][2])) < l_13[7]), l_59, g_69) >= g_171[1][6][2]), 0x43L)) < l_64.f2) != 5UL), g_69, g_405[3][0]), l_64.f0, l_59) >= l_64.f1)), l_64.f3)) > 0x66CCL))
+ { /* block id: 365 */
+ int32_t l_524 = (-9L);
+ union U2 l_580 = {0xF3A458B5L};
+ int8_t *l_581 = (void*)0;
+ int32_t l_589 = 0x34F78B18L;
+ uint32_t l_605 = 0xE76FF136L;
+ for (g_234 = (-16); (g_234 >= 13); g_234 = safe_add_func_int32_t_s_s(g_234, 6))
+ { /* block id: 368 */
+ union U2 l_520 = {0x03E6CC5CL};
+ int32_t l_529 = (-7L);
+ int32_t *l_566 = &l_175[0][0];
+ const uint8_t *l_577 = &g_171[2][4][1];
+ uint32_t *l_584 = &l_580.f1;
+ uint8_t l_587 = 0x74L;
+ if (l_64.f1)
+ { /* block id: 369 */
+ uint32_t l_516 = 0UL;
+ uint8_t *l_519 = &g_42.f2;
+ union U2 *l_521 = &l_64;
+ int32_t *l_525 = (void*)0;
+ int32_t *l_526 = &g_61[3][1][1];
+ int32_t *l_527[7][2] = {{&l_13[4],&l_13[4]},{(void*)0,&l_13[4]},{&l_13[4],(void*)0},{&l_13[4],&l_13[4]},{(void*)0,&l_13[4]},{&l_13[4],(void*)0},{&l_13[4],&l_13[4]}};
+ int16_t l_554 = 0xB066L;
+ uint16_t *l_571 = &g_165[6];
+ int i, j;
+ l_529 = (safe_div_func_int16_t_s_s((safe_rshift_func_uint16_t_u_s(l_516, (safe_rshift_func_int8_t_s_u(l_516, ((*l_519) = 0x47L))))), (((*l_521) = l_520) , ((l_528 = ((*l_526) = (safe_lshift_func_uint16_t_u_s((func_16(g_163, l_524, l_519, &g_70) && 1L), 8)))) | l_520.f0))));
+ if ((*l_526))
+ break;
+ for (g_34 = 0; (g_34 <= 5); g_34 = safe_add_func_int16_t_s_s(g_34, 5))
+ { /* block id: 378 */
+ uint32_t l_534 = 0x9C38BE8CL;
+ int8_t **l_537 = &g_69;
+ int32_t *l_565 = &l_13[0];
+ }
+ }
+ else
+ { /* block id: 394 */
+ return l_175[0][1];
+ }
+ l_589 = ((*g_588) = (safe_mod_func_uint16_t_u_u(((((l_576[2] = &g_218) == l_577) && (~(safe_mul_func_uint8_t_u_u((l_13[5] >= (l_580 , g_165[5])), (*l_566))))) > 0x0256L), l_47)));
+ (*g_588) ^= (*l_566);
+ }
+ for (g_117 = (-29); (g_117 != (-7)); g_117 = safe_add_func_int8_t_s_s(g_117, 5))
+ { /* block id: 407 */
+ int32_t *l_592 = &l_13[7];
+ int32_t *l_593 = &l_13[0];
+ int32_t *l_594 = &l_175[0][2];
+ int32_t *l_595 = &l_509[1][5];
+ int32_t *l_596 = &l_175[0][2];
+ int32_t *l_597 = &l_509[1][5];
+ int32_t *l_598 = &l_175[1][2];
+ int32_t *l_599 = (void*)0;
+ int32_t *l_600 = &g_255;
+ int32_t *l_601 = &g_25;
+ int32_t *l_602 = &g_255;
+ int32_t l_603 = 0x83DE74D8L;
+ int32_t *l_604[5][7] = {{(void*)0,(void*)0,(void*)0,(void*)0,(void*)0,(void*)0,(void*)0},{&l_175[0][2],&g_61[3][1][0],&l_509[3][2],&g_61[3][1][0],&l_175[0][2],(void*)0,&l_175[0][2]},{(void*)0,(void*)0,(void*)0,(void*)0,(void*)0,&g_255,(void*)0},{&l_509[3][2],&g_255,&l_509[3][2],(void*)0,&l_509[8][3],(void*)0,&l_509[3][2]},{(void*)0,(void*)0,(void*)0,(void*)0,(void*)0,(void*)0,(void*)0}};
+ int i, j;
+ ++l_605;
+ }
+ }
+ else
+ { /* block id: 410 */
+ int32_t *l_608[10] = {&l_175[0][2],&l_175[0][2],&l_175[0][2],&l_175[0][2],&l_175[0][2],&l_175[0][2],&l_175[0][2],&l_175[0][2],&l_175[0][2],&l_175[0][2]};
+ uint8_t *l_612 = (void*)0;
+ uint8_t **l_613 = (void*)0;
+ uint8_t **l_614 = &l_612;
+ uint8_t **l_615[10] = {&l_576[5],&l_576[2],&l_576[5],&l_576[2],&l_576[5],&l_576[2],&l_576[5],&l_576[2],&l_576[5],&l_576[2]};
+ uint32_t l_617 = 0xA732A71CL;
+ const int8_t *l_618 = &g_70;
+ int32_t *l_622 = (void*)0;
+ union U1 l_641 = {0};
+ int i;
+ if (func_50(func_56(&g_70, l_608[8]), (safe_lshift_func_uint8_t_u_s(l_13[7], 7)), (((safe_unary_minus_func_int8_t_s(((*g_69) = ((*g_248) ^ (l_175[0][3] > ((g_616 = ((*l_614) = l_612)) != (l_576[4] = &g_23))))))) | l_64.f1) && g_165[4]), &l_175[0][0], (**g_396)))
+ { /* block id: 415 */
+ return l_528;
+ }
+ else
+ { /* block id: 417 */
+ int8_t l_619 = 0xF5L;
+ const int32_t *l_627[7][2] = {{&g_42.f0,&g_42.f0},{&g_42.f0,&g_42.f0},{&g_42.f0,&g_42.f0},{&l_64.f0,&l_64.f0},{&l_64.f0,&g_42.f0},{&g_42.f0,&g_42.f0},{&g_42.f0,&g_42.f0}};
+ const int32_t **l_626 = &l_627[3][0];
+ int32_t l_628[6] = {0xF3CEC250L,0xF3CEC250L,0xF3CEC250L,0xF3CEC250L,0xF3CEC250L,0xF3CEC250L};
+ int16_t l_636 = 0xA7CDL;
+ uint8_t l_637 = 0x6EL;
+ int i, j;
+ for (g_387 = 7; (g_387 >= 0); g_387 -= 1)
+ { /* block id: 420 */
+ int8_t *l_620[4][4][9] = {{{&g_163.f0,&l_619,(void*)0,&g_163.f0,&g_163.f0,(void*)0,&l_619,&g_163.f0,&g_405[3][0].f0},{&g_70,&g_471,(void*)0,&g_70,&l_619,&g_70,(void*)0,&g_117,&g_471},{&g_405[3][0].f0,&l_619,&g_163.f0,&g_471,(void*)0,&g_471,&g_163.f0,&l_619,&g_405[3][0].f0},{&g_163.f0,&g_471,&l_619,&g_70,&g_70,(void*)0,&g_471,(void*)0,&g_405[3][0].f0}},{{&g_163.f0,(void*)0,(void*)0,&g_163.f0,(void*)0,(void*)0,(void*)0,&g_163.f0,&g_163.f0},{&g_70,&g_405[3][0].f0,&g_70,&g_471,(void*)0,(void*)0,(void*)0,&g_471,&g_163.f0},{&l_619,(void*)0,&g_471,&g_163.f0,&g_163.f0,&g_117,&g_163.f0,&g_163.f0,&g_471},{&g_405[3][0].f0,&g_405[3][0].f0,&g_405[3][0].f0,&g_163.f0,&l_619,&g_117,&g_471,&g_70,&g_70}},{{&g_471,&g_163.f0,&l_619,&g_163.f0,(void*)0,&l_619,&l_619,(void*)0,&g_163.f0},{&g_405[3][0].f0,&g_117,&g_405[3][0].f0,(void*)0,&g_471,(void*)0,&g_70,&g_70,&l_619},{&g_117,&l_619,&g_471,&g_163.f0,(void*)0,&g_405[3][0].f0,&g_163.f0,&g_405[3][0].f0,(void*)0},{(void*)0,&g_70,&g_70,(void*)0,&g_117,(void*)0,&g_70,&l_619,&g_70}},{{&g_163.f0,&g_117,&g_163.f0,&g_163.f0,&l_619,&g_163.f0,&g_117,&g_117,&g_163.f0},{&g_117,&g_163.f0,(void*)0,&g_163.f0,&g_117,&l_619,&g_405[3][0].f0,&g_471,&g_70},{&l_619,&g_163.f0,&g_405[3][0].f0,&g_163.f0,(void*)0,&g_117,(void*)0,&g_163.f0,(void*)0},{&g_70,&l_619,&l_619,&l_619,&l_619,&g_70,(void*)0,&g_117,&g_70}}};
+ int32_t l_629 = 0x94DF55BDL;
+ int32_t l_630 = 0x78F2A151L;
+ int32_t l_631 = 0x108DD9F6L;
+ int32_t l_632 = 1L;
+ int32_t l_633 = 0x9920FA05L;
+ int32_t l_634 = 8L;
+ int32_t *l_650 = &g_255;
+ int i, j, k;
+ for (g_163.f0 = 0; (g_163.f0 <= 3); g_163.f0 += 1)
+ { /* block id: 423 */
+ int32_t *l_621[7][7] = {{&l_175[0][2],&g_61[3][4][2],&l_509[1][5],&l_175[0][2],&l_13[7],&l_175[0][2],&l_509[1][5]},{&g_255,&g_255,&l_13[7],&l_509[1][5],&g_61[3][4][2],(void*)0,&g_255},{&g_255,&l_509[1][5],&l_509[1][5],&g_61[3][4][2],&g_255,&g_255,&g_61[3][4][2]},{&l_175[0][2],&l_13[7],&l_175[0][2],&l_509[1][5],&g_61[3][4][2],&l_175[0][2],&l_175[0][2]},{&g_61[3][4][2],&l_13[7],&l_509[1][5],&l_509[1][5],&l_13[7],&l_13[7],&l_13[7]},{(void*)0,&l_509[1][5],&l_509[1][5],(void*)0,&l_175[0][2],&l_175[0][2],&g_61[3][4][2]},{&g_255,&g_255,&l_509[1][5],&l_509[1][5],&g_61[3][4][2],&g_255,&g_255}};
+ const int32_t *l_624 = &g_78;
+ const int32_t **l_623[5];
+ int i, j;
+ for (i = 0; i < 5; i++)
+ l_623[i] = &l_624;
+ for (g_78 = 3; (g_78 >= 0); g_78 -= 1)
+ { /* block id: 426 */
+ int i, j, k;
+ g_61[(g_78 + 1)][(g_163.f0 + 1)][g_163.f0] ^= l_619;
+ (*g_95) = func_56(l_620[0][2][7], l_621[0][2]);
+ (*g_95) = (*g_95);
+ l_622 = l_621[0][2];
+ }
+ for (l_619 = 1; (l_619 <= 7); l_619 += 1)
+ { /* block id: 434 */
+ const int32_t ***l_625[2];
+ int i;
+ for (i = 0; i < 2; i++)
+ l_625[i] = &l_623[1];
+ l_626 = l_623[4];
+ }
+ }
+ --l_637;
+ for (l_47 = 0; (l_47 <= 3); l_47 += 1)
+ { /* block id: 441 */
+ int32_t l_640 = 0xEDD92DAAL;
+ int32_t *l_642 = (void*)0;
+ int8_t *l_649 = (void*)0;
+ (*g_588) |= (((g_165[2] = l_640) >= l_640) | ((((l_641 , (*g_170)) | (l_628[0] = (l_13[2] >= (func_50(l_642, (func_50(&l_628[2], (((g_643 == ((safe_rshift_func_uint8_t_u_s(l_628[2], 6)) , &g_644)) == 0x572EL) & 0L), l_634, l_608[7], (**g_396)) ^ 9UL), (*g_69), l_608[0], (*g_397)) || 0x10DDA243L)))) < l_13[7]) > l_13[g_387]));
+ for (l_636 = 0; (l_636 <= 3); l_636 += 1)
+ { /* block id: 447 */
+ int32_t *l_651 = &l_628[2];
+ l_650 = &l_628[2];
+ (*g_95) = l_651;
+ if ((**g_95))
+ break;
+ }
+ for (g_163.f0 = 5; (g_163.f0 >= 2); g_163.f0 -= 1)
+ { /* block id: 455 */
+ int i, j, k;
+ g_61[g_387][l_47][l_47] = (safe_unary_minus_func_int16_t_s(l_509[(l_47 + 4)][l_47]));
+ l_509[3][0] ^= (*l_650);
+ return (*g_588);
+ }
+ for (l_528 = 2; (l_528 <= 7); l_528 += 1)
+ { /* block id: 462 */
+ return (*g_404);
+ }
+ }
+ }
+ for (l_637 = 0; (l_637 == 3); l_637++)
+ { /* block id: 469 */
+ uint32_t l_655[6];
+ int i;
+ for (i = 0; i < 6; i++)
+ l_655[i] = 0x4CE808BAL;
+ (*g_95) = l_622;
+ if (l_655[4])
+ continue;
+ }
+ }
+ }
+ for (g_218 = 3; (g_218 == 24); g_218++)
+ { /* block id: 477 */
+ for (l_635 = 24; (l_635 <= 1); l_635 = safe_sub_func_int32_t_s_s(l_635, 2))
+ { /* block id: 480 */
+ (*g_588) = ((&g_78 == &g_78) ^ 0x108FL);
+ }
+ }
+ return (*g_588);
+}
+
+
+/* ------------------------------------------ */
+/*
+ * reads : g_387 g_95 g_84 g_61 g_170 g_171 g_163.f1 g_25 g_396 g_397 g_42 g_42.f3 g_117 g_248 g_246 g_255 g_380 g_471 g_249 g_165 g_163 g_69 g_70 g_42.f1 g_218 g_404 g_505
+ * writes: g_387 g_60 g_404 g_218 g_25 g_117 g_396 g_255 g_61 g_471 g_170 g_34
+ */
+static uint8_t func_4(int8_t * p_5, uint16_t p_6, int8_t * p_7)
+{ /* block id: 299 */
+ int32_t *l_430[6][9] = {{&g_61[3][1][1],&g_61[3][1][1],(void*)0,&g_61[1][1][0],&g_25,(void*)0,&g_25,&g_61[1][1][0],(void*)0},{&g_25,&g_25,&g_61[3][5][3],(void*)0,&g_61[5][0][1],&g_61[3][5][3],&g_61[5][0][1],(void*)0,&g_61[3][5][3]},{&g_61[3][1][1],&g_61[3][1][1],(void*)0,&g_61[1][1][0],&g_25,(void*)0,&g_25,&g_61[1][1][0],(void*)0},{&g_25,&g_25,&g_61[3][5][3],(void*)0,&g_61[5][0][1],&g_61[3][5][3],&g_61[5][0][1],(void*)0,&g_61[3][5][3]},{&g_61[3][1][1],&g_61[3][1][1],(void*)0,&g_61[3][1][1],&g_61[1][1][0],(void*)0,&g_61[1][1][0],&g_61[3][1][1],(void*)0},{&g_61[5][0][1],&g_61[5][0][1],&g_25,&g_25,(void*)0,&g_25,(void*)0,&g_25,&g_25}};
+ uint32_t l_437[7][6] = {{0x73C76190L,0x73C76190L,1UL,0x73C76190L,0x73C76190L,1UL},{0x73C76190L,0x73C76190L,1UL,0x73C76190L,0x73C76190L,1UL},{0x73C76190L,0x73C76190L,1UL,0x73C76190L,0x73C76190L,1UL},{0x73C76190L,0x73C76190L,1UL,0x73C76190L,0x73C76190L,1UL},{0x73C76190L,0x73C76190L,1UL,0x73C76190L,0x73C76190L,1UL},{0x73C76190L,0x73C76190L,1UL,0x73C76190L,0x73C76190L,1UL},{0x73C76190L,0x73C76190L,1UL,0x73C76190L,0x73C76190L,1UL}};
+ union U0 l_439 = {0x5BL};
+ union U2 l_464 = {0x013712E9L};
+ int8_t *l_468 = (void*)0;
+ union U2 l_470 = {0xFCE83381L};
+ const union U1 l_504 = {0};
+ int i, j;
+ for (g_387 = 10; (g_387 > (-15)); g_387--)
+ { /* block id: 302 */
+ union U0 l_438[9][10] = {{{0x4FL},{0x2CL},{0x2CL},{0x4FL},{-6L},{0x4FL},{0x2CL},{0x2CL},{0x4FL},{-6L}},{{0x4FL},{0x2CL},{0x2CL},{0x4FL},{-6L},{0x4FL},{0x2CL},{0x2CL},{0x4FL},{-6L}},{{0x4FL},{0x2CL},{0x2CL},{0x4FL},{-6L},{0x4FL},{0x2CL},{0x2CL},{0x4FL},{-6L}},{{0x4FL},{0x2CL},{0x2CL},{0x4FL},{-6L},{0x4FL},{0x2CL},{0x6AL},{0x2CL},{-5L}},{{0x2CL},{0x6AL},{0x6AL},{0x2CL},{-5L},{0x2CL},{0x6AL},{0x6AL},{0x2CL},{-5L}},{{0x2CL},{0x6AL},{0x6AL},{0x2CL},{-5L},{0x2CL},{0x6AL},{0x6AL},{0x2CL},{-5L}},{{0x2CL},{0x6AL},{0x6AL},{0x2CL},{-5L},{0x2CL},{0x6AL},{0x6AL},{0x2CL},{-5L}},{{0x2CL},{0x6AL},{0x6AL},{0x2CL},{-5L},{0x2CL},{0x6AL},{0x6AL},{0x2CL},{-5L}},{{0x2CL},{0x6AL},{0x6AL},{0x2CL},{-5L},{0x2CL},{0x6AL},{0x6AL},{0x2CL},{-5L}}};
+ int8_t *l_444 = &l_438[8][2].f0;
+ uint8_t *l_445 = (void*)0;
+ uint8_t *l_446 = (void*)0;
+ uint8_t *l_447 = (void*)0;
+ int32_t *l_448 = &g_25;
+ int i, j;
+ (*l_448) = func_50(((*g_95) = l_430[0][6]), (safe_lshift_func_uint8_t_u_u((safe_mod_func_int32_t_s_s((safe_mul_func_int16_t_s_s((l_437[5][3] , ((g_218 = func_16(l_438[8][2], func_16(l_439, (g_84 , func_16(l_439, (safe_rshift_func_uint8_t_u_s(0x01L, (safe_rshift_func_int16_t_s_s(0xFC91L, 13)))), p_7, l_444)), p_7, p_7), p_7, l_444)) ^ (*g_170))), g_387)), g_25)), 3)), l_438[8][2].f1, l_448, (**g_396));
+ (*l_448) &= 9L;
+ if (p_6)
+ break;
+ }
+ for (g_117 = (-26); (g_117 < 23); g_117++)
+ { /* block id: 311 */
+ int16_t l_469 = (-9L);
+ uint32_t *l_486 = &l_470.f1;
+ uint32_t **l_485[4] = {&l_486,&l_486,&l_486,&l_486};
+ int8_t l_497 = 0L;
+ int32_t l_501 = 1L;
+ uint16_t l_508 = 0x4BC4L;
+ int i;
+ if (p_6)
+ { /* block id: 312 */
+ int32_t *l_451[8] = {&g_255,&g_255,&g_255,&g_255,&g_255,&g_255,&g_255,&g_255};
+ int32_t *l_452 = (void*)0;
+ const union U1 l_472 = {0};
+ union U0 l_479 = {0xB8L};
+ int i;
+ for (l_439.f0 = 3; (l_439.f0 >= 0); l_439.f0 -= 1)
+ { /* block id: 315 */
+ union U2 ***l_453 = &g_396;
+ int32_t l_465 = 0xAF964579L;
+ uint16_t *l_482 = &g_165[0];
+ l_452 = ((*g_95) = func_56(p_5, l_451[0]));
+ (*l_453) = &g_397;
+ for (g_387 = 5; (g_387 >= 0); g_387 -= 1)
+ { /* block id: 321 */
+ union U0 l_454 = {8L};
+ int i, j, k;
+ if (g_61[l_439.f0][g_387][l_439.f0])
+ { /* block id: 322 */
+ int32_t *l_463 = &g_255;
+ uint16_t l_466[9] = {0xBF85L,0xBF85L,0x789FL,0xBF85L,0xBF85L,0x789FL,0xBF85L,0xBF85L,0x789FL};
+ uint16_t *l_467[1];
+ int i, j, k;
+ for (i = 0; i < 1; i++)
+ l_467[i] = &g_165[4];
+ g_61[(l_439.f0 + 3)][g_387][l_439.f0] = (func_16(l_454, (safe_rshift_func_uint16_t_u_u(((*l_463) ^= ((safe_sub_func_int16_t_s_s(((safe_sub_func_uint16_t_u_u(l_437[(l_439.f0 + 3)][(l_439.f0 + 2)], (l_466[1] = (func_16(l_454, (func_16(func_21(((*p_5) != (safe_sub_func_uint8_t_u_u((func_50(l_463, g_387, (*p_5), l_463, ((255UL == 0xC5L) , l_464)) || p_6), 1L)))), l_465, p_5, &g_70) == 0xC5F1L), p_5, p_5) ^ 0x5022C929L)))) != (-9L)), (*g_248))) ^ 0x01E9L)), g_380)), l_468, l_468) >= l_469);
+ }
+ else
+ { /* block id: 326 */
+ (*l_452) ^= (-1L);
+ }
+ (*l_452) = ((g_84 , (((l_470 , (*g_170)) == g_471) ^ ((((func_50(&g_61[l_439.f0][g_387][l_439.f0], p_6, (g_61[l_439.f0][g_387][l_439.f0] = 0L), (l_472 , l_452), l_464) != 0UL) | 0x92L) | (*g_249)) > (*g_170)))) != (*g_249));
+ }
+ for (g_471 = 0; (g_471 <= 3); g_471 += 1)
+ { /* block id: 334 */
+ uint16_t *l_480 = (void*)0;
+ int32_t l_484 = 0x0E90AE7DL;
+ for (g_387 = 0; (g_387 <= 6); g_387 += 1)
+ { /* block id: 337 */
+ uint16_t **l_481 = &l_480;
+ union U2 l_483 = {4L};
+ int i, j, k;
+ (*g_95) = func_37((safe_rshift_func_int8_t_s_u(0xCBL, g_61[(l_439.f0 + 3)][(l_439.f0 + 1)][g_471])), (***l_453), &g_61[(l_439.f0 + 3)][(l_439.f0 + 1)][g_471], ((l_439 , ((safe_mod_func_uint32_t_u_u(((((*l_481) = (((safe_sub_func_int32_t_s_s(g_165[g_471], p_6)) , l_479) , l_480)) == l_482) & (*g_170)), p_6)) , l_483)) , l_484));
+ }
+ for (l_465 = 3; (l_465 >= 0); l_465 -= 1)
+ { /* block id: 343 */
+ int i, j, k;
+ return g_61[(g_471 + 1)][(l_439.f0 + 2)][l_465];
+ }
+ }
+ }
+ return (*g_170);
+ }
+ else
+ { /* block id: 349 */
+ uint32_t ***l_487 = (void*)0;
+ uint32_t ***l_488 = &l_485[3];
+ int32_t l_495[9][9][2] = {{{0L,0x40CE7CD7L},{1L,0x40CE7CD7L},{0L,0x50ED6328L},{0xADA7BC83L,0x40CE7CD7L},{0L,0x40CE7CD7L},{0xADA7BC83L,0x50ED6328L},{0L,0x40CE7CD7L},{1L,0x40CE7CD7L},{0L,0x50ED6328L}},{{0xADA7BC83L,0x40CE7CD7L},{0L,0x40CE7CD7L},{0xADA7BC83L,0x50ED6328L},{0L,0x40CE7CD7L},{1L,0x40CE7CD7L},{0L,0x50ED6328L},{0xADA7BC83L,0x40CE7CD7L},{0L,0x40CE7CD7L},{0xADA7BC83L,0x50ED6328L}},{{0L,0x40CE7CD7L},{1L,0x40CE7CD7L},{0L,0x50ED6328L},{0xADA7BC83L,0x40CE7CD7L},{0L,0x40CE7CD7L},{0xADA7BC83L,0x50ED6328L},{0L,0x40CE7CD7L},{1L,0x40CE7CD7L},{0L,0x50ED6328L}},{{0xADA7BC83L,0x40CE7CD7L},{0L,0x40CE7CD7L},{0xADA7BC83L,0x50ED6328L},{0L,0x40CE7CD7L},{1L,0x40CE7CD7L},{0L,0x50ED6328L},{0xADA7BC83L,0x40CE7CD7L},{0L,0x40CE7CD7L},{0xADA7BC83L,0x50ED6328L}},{{0L,0x40CE7CD7L},{1L,0x40CE7CD7L},{0L,0x50ED6328L},{0xADA7BC83L,0x40CE7CD7L},{0L,0x40CE7CD7L},{0xADA7BC83L,0x50ED6328L},{0L,0x40CE7CD7L},{1L,0x40CE7CD7L},{0L,0x50ED6328L}},{{0xADA7BC83L,0x40CE7CD7L},{0L,0x40CE7CD7L},{0xADA7BC83L,0x50ED6328L},{0L,0x40CE7CD7L},{1L,0x40CE7CD7L},{0L,0x50ED6328L},{0xADA7BC83L,0x40CE7CD7L},{0L,0x40CE7CD7L},{0xADA7BC83L,0x50ED6328L}},{{0L,0x40CE7CD7L},{1L,0x40CE7CD7L},{0L,0x50ED6328L},{0xADA7BC83L,0x40CE7CD7L},{0L,0x50ED6328L},{1L,0xD0A14D25L},{0L,0x50ED6328L},{(-9L),0x50ED6328L},{0L,0xD0A14D25L}},{{1L,0x50ED6328L},{0x1F85E5ACL,0x50ED6328L},{1L,0xD0A14D25L},{0L,0x50ED6328L},{(-9L),0x50ED6328L},{0L,0xD0A14D25L},{1L,0x50ED6328L},{0x1F85E5ACL,0x50ED6328L},{1L,0xD0A14D25L}},{{0L,0x50ED6328L},{(-9L),0x50ED6328L},{0L,0xD0A14D25L},{1L,0x50ED6328L},{0x1F85E5ACL,0x50ED6328L},{1L,0xD0A14D25L},{0L,0x50ED6328L},{(-9L),0x50ED6328L},{0L,0xD0A14D25L}}};
+ uint16_t *l_496 = &g_34;
+ int i, j, k;
+ (*l_488) = l_485[1];
+ (*g_95) = func_37((p_6 ^ 0xE2F4L), (**g_396), l_430[0][6], ((safe_sub_func_uint32_t_u_u((safe_lshift_func_uint16_t_u_u(((*l_496) = (safe_mul_func_uint8_t_u_u(func_16(l_439, l_495[1][7][1], p_5, &g_70), 0UL))), g_25)), g_42.f1)) <= l_469));
+ for (g_218 = 0; (g_218 <= 5); g_218 += 1)
+ { /* block id: 355 */
+ uint32_t l_498[10][6][2] = {{{0UL,0x4710D315L},{0xC89510DFL,18446744073709551614UL},{18446744073709551615UL,0x32FB2497L},{18446744073709551615UL,0UL},{1UL,0xA19F4CA6L},{18446744073709551614UL,1UL}},{{0UL,1UL},{0x243448FFL,0x243448FFL},{18446744073709551615UL,18446744073709551614UL},{0x0D81DB8EL,0x78E1239EL},{1UL,0x4710D315L},{1UL,1UL}},{{0x32FB2497L,18446744073709551615UL},{0x32FB2497L,1UL},{1UL,0x4710D315L},{1UL,0x78E1239EL},{0x0D81DB8EL,18446744073709551614UL},{18446744073709551615UL,0x243448FFL}},{{0x243448FFL,1UL},{0UL,1UL},{18446744073709551614UL,0xA19F4CA6L},{1UL,0UL},{18446744073709551615UL,0x32FB2497L},{18446744073709551615UL,18446744073709551614UL}},{{0xC89510DFL,0x4710D315L},{0xFF073B46L,18446744073709551614UL},{0UL,1UL},{18446744073709551615UL,0UL},{0xF99EA8BEL,0xFF073B46L},{0x78E1239EL,18446744073709551615UL}},{{1UL,18446744073709551615UL},{0x78E1239EL,0xFF073B46L},{0xF99EA8BEL,0UL},{18446744073709551615UL,1UL},{0UL,18446744073709551614UL},{0xFF073B46L,0x53B970BDL}},{{0x78E1239EL,18446744073709551610UL},{0xC89510DFL,18446744073709551615UL},{0UL,0xFF073B46L},{0x76FB5125L,18446744073709551614UL},{18446744073709551610UL,1UL},{0UL,18446744073709551612UL}},{{0xF99EA8BEL,0xF99EA8BEL},{0UL,18446744073709551610UL},{0xA19F4CA6L,18446744073709551615UL},{18446744073709551612UL,0x53B970BDL},{0x76FB5125L,18446744073709551612UL},{18446744073709551615UL,0xC89510DFL}},{{18446744073709551615UL,18446744073709551612UL},{0x76FB5125L,0x53B970BDL},{18446744073709551612UL,18446744073709551615UL},{0xA19F4CA6L,18446744073709551610UL},{0UL,0xF99EA8BEL},{0xF99EA8BEL,18446744073709551612UL}},{{0UL,1UL},{18446744073709551610UL,18446744073709551614UL},{0x76FB5125L,0xFF073B46L},{0UL,18446744073709551615UL},{0xC89510DFL,18446744073709551610UL},{0x78E1239EL,0x53B970BDL}}};
+ int i, j, k;
+ if ((*g_404))
+ break;
+ l_498[0][0][0]--;
+ l_501 = l_498[0][0][0];
+ }
+ }
+ l_501 &= (func_21((((~p_6) , (safe_div_func_int32_t_s_s(p_6, ((l_504 , 0L) | ((void*)0 == g_505))))) , (safe_rshift_func_int8_t_s_u(0x75L, l_508)))) , p_6);
+ }
+ return (*g_170);
+}
+
+
+/* ------------------------------------------ */
+/*
+ * reads : g_95 g_60 g_234 g_249 g_246 g_61 g_69 g_70 g_42.f3 g_42.f1 g_218 g_170 g_171 g_163.f1 g_34 g_163.f0 g_42 g_84 g_248 g_255
+ * writes: g_60 g_70 g_78 g_34 g_163.f0 g_61 g_218 g_165 g_234 g_117 g_42.f1 g_255
+ */
+static int8_t * func_8(uint8_t p_9, const uint32_t p_10, const int8_t * p_11, union U0 p_12)
+{ /* block id: 293 */
+ int8_t l_406[2][8] = {{0x4CL,0x4CL,(-6L),0x4CL,0x4CL,(-6L),0x4CL,0x4CL},{0x31L,0x4CL,0x31L,0x31L,0x4CL,0x31L,0x31L,0x4CL}};
+ int32_t *l_407 = &g_61[1][3][0];
+ int32_t *l_408 = (void*)0;
+ int32_t *l_409 = &g_61[3][1][1];
+ int32_t *l_410 = &g_25;
+ int32_t *l_411 = (void*)0;
+ int32_t *l_412 = &g_25;
+ int32_t *l_413 = &g_61[3][1][1];
+ int32_t *l_414 = &g_255;
+ int32_t *l_415 = &g_61[3][1][1];
+ int32_t *l_416 = (void*)0;
+ int32_t l_417[3][4][5];
+ int32_t *l_418[6][10][1] = {{{(void*)0},{(void*)0},{(void*)0},{&g_61[1][4][2]},{(void*)0},{(void*)0},{(void*)0},{(void*)0},{&g_61[1][4][2]},{(void*)0}},{{(void*)0},{(void*)0},{(void*)0},{(void*)0},{&g_25},{&g_25},{(void*)0},{(void*)0},{(void*)0},{(void*)0}},{{(void*)0},{(void*)0},{(void*)0},{&g_25},{&g_25},{(void*)0},{(void*)0},{(void*)0},{(void*)0},{(void*)0}},{{(void*)0},{(void*)0},{&g_25},{&g_25},{(void*)0},{(void*)0},{(void*)0},{(void*)0},{(void*)0},{(void*)0}},{{(void*)0},{&g_25},{&g_25},{(void*)0},{(void*)0},{(void*)0},{(void*)0},{(void*)0},{(void*)0},{(void*)0}},{{&g_25},{&g_25},{(void*)0},{(void*)0},{(void*)0},{(void*)0},{(void*)0},{(void*)0},{(void*)0},{&g_25}}};
+ int16_t l_419 = 0x46F3L;
+ int32_t l_420 = 0xEFAEA218L;
+ int32_t l_421 = 0xF0C3CF87L;
+ int32_t l_422 = 0xF5496424L;
+ int8_t l_423 = (-7L);
+ uint32_t l_424 = 0xBE103C84L;
+ union U2 l_427 = {0x21442813L};
+ int i, j, k;
+ for (i = 0; i < 3; i++)
+ {
+ for (j = 0; j < 4; j++)
+ {
+ for (k = 0; k < 5; k++)
+ l_417[i][j][k] = 0xF85FD576L;
+ }
+ }
+ l_406[1][3] ^= p_9;
+ (*g_95) = l_407;
+ l_424--;
+ (*l_414) &= func_27(p_9, (*g_95), l_427, (*g_95), ((&g_387 == (l_427 , &g_380)) != ((((p_12.f1 <= (0x201B5C96L > p_9)) >= g_234) ^ (*g_249)) , 0x9438L)));
+ return &g_117;
+}
+
+
+/* ------------------------------------------ */
+/*
+ * reads : g_61
+ * writes: g_404
+ */
+static const int8_t func_16(union U0 p_17, uint8_t p_18, int8_t * p_19, int8_t * p_20)
+{ /* block id: 197 */
+ uint16_t l_302[6][3] = {{1UL,1UL,1UL},{0UL,0UL,0UL},{1UL,1UL,1UL},{0UL,0UL,0UL},{1UL,1UL,1UL},{0UL,0UL,0UL}};
+ int32_t *l_342[5][7][4] = {{{&g_255,&g_61[3][1][1],&g_61[2][3][3],&g_25},{&g_61[3][1][1],&g_25,&g_255,&g_255},{&g_255,&g_255,&g_255,&g_255},{&g_255,&g_255,&g_255,&g_255},{&g_255,&g_25,&g_61[3][1][1],&g_25},{&g_61[2][3][3],&g_61[3][1][1],&g_255,&g_61[3][1][1]},{&g_61[2][3][3],&g_255,&g_61[3][1][1],(void*)0}},{{&g_61[5][4][3],&g_255,&g_61[4][5][1],&g_25},{&g_255,(void*)0,&g_255,&g_25},{&g_61[4][5][1],&g_255,&g_61[5][4][3],(void*)0},{&g_61[2][3][3],&g_25,&g_255,&g_255},{&g_25,(void*)0,&g_255,&g_61[3][1][1]},{&g_61[2][3][3],&g_25,&g_61[5][4][3],&g_25},{&g_61[4][5][1],&g_25,&g_255,&g_25}},{{&g_255,&g_25,&g_61[4][5][1],&g_25},{&g_61[5][4][3],&g_25,&g_61[2][3][3],&g_61[3][1][1]},{&g_255,(void*)0,&g_25,&g_255},{&g_255,&g_25,&g_61[2][3][3],(void*)0},{&g_61[5][4][3],&g_255,&g_61[4][5][1],&g_25},{&g_255,(void*)0,&g_255,&g_25},{&g_61[4][5][1],&g_255,&g_61[5][4][3],(void*)0}},{{&g_61[2][3][3],&g_25,&g_255,&g_255},{&g_25,(void*)0,&g_255,&g_61[3][1][1]},{&g_61[2][3][3],&g_25,&g_61[5][4][3],&g_25},{&g_61[4][5][1],&g_25,&g_255,&g_25},{&g_255,&g_25,&g_61[4][5][1],&g_25},{&g_61[5][4][3],&g_25,&g_61[2][3][3],&g_61[3][1][1]},{&g_255,(void*)0,&g_25,&g_255}},{{&g_255,&g_25,&g_61[2][3][3],(void*)0},{&g_61[5][4][3],&g_255,&g_61[4][5][1],&g_25},{&g_255,(void*)0,&g_61[4][5][1],&g_255},{&g_61[3][1][1],&g_61[3][1][1],&g_25,&g_25},{&g_255,&g_61[3][1][1],&g_255,&g_61[3][1][1]},{&g_61[5][1][3],&g_25,&g_255,&g_255},{&g_255,(void*)0,&g_25,&g_61[3][1][1]}}};
+ const union U2 *l_352 = &g_42;
+ uint16_t *l_377 = &g_165[1];
+ uint16_t **l_376[4][4] = {{&l_377,(void*)0,&l_377,(void*)0},{&l_377,(void*)0,&l_377,(void*)0},{&l_377,(void*)0,&l_377,(void*)0},{&l_377,(void*)0,&l_377,(void*)0}};
+ uint32_t l_393 = 4294967290UL;
+ const uint8_t *l_398 = &g_42.f2;
+ int8_t **l_401 = &g_69;
+ int8_t ***l_402 = &l_401;
+ const int32_t *l_403 = &g_61[3][1][1];
+ int i, j, k;
+ for (p_18 = 25; (p_18 < 17); p_18 = safe_sub_func_uint32_t_u_u(p_18, 5))
+ { /* block id: 200 */
+ int32_t l_308 = 0xDC603431L;
+ int32_t l_309 = 0x1C33B4EEL;
+ union U1 *l_336 = &g_84;
+ int32_t l_388 = 4L;
+ uint8_t * const l_399 = &g_42.f2;
+ int8_t **l_400 = &g_69;
+ }
+ (*l_402) = l_401;
+ g_404 = (p_17.f1 , l_403);
+ return (*l_403);
+}
+
+
+/* ------------------------------------------ */
+/*
+ * reads :
+ * writes: g_25
+ */
+static union U0 func_21(uint32_t p_22)
+{ /* block id: 1 */
+ int32_t *l_24 = &g_25;
+ union U0 l_26 = {-3L};
+ (*l_24) = p_22;
+ return l_26;
+}
+
+
+/* ------------------------------------------ */
+/*
+ * reads : g_61 g_69 g_70 g_42.f3 g_42.f1 g_218 g_170 g_171 g_163.f1 g_95 g_34 g_163.f0 g_42 g_84 g_248 g_246 g_234 g_249 g_78 g_117
+ * writes: g_70 g_78 g_34 g_163.f0 g_61 g_60 g_218 g_165 g_234 g_117 g_42.f1
+ */
+static int8_t func_27(uint16_t p_28, int32_t * p_29, union U2 p_30, int32_t * const p_31, int32_t p_32)
+{ /* block id: 106 */
+ union U1 *l_177 = &g_84;
+ union U1 **l_176 = &l_177;
+ int32_t *l_178 = &g_61[3][1][1];
+ int8_t *l_181[8] = {&g_163.f0,&g_163.f0,&g_163.f0,&g_163.f0,&g_163.f0,&g_163.f0,&g_163.f0,&g_163.f0};
+ int32_t *l_182 = &g_61[3][1][1];
+ union U2 l_252 = {8L};
+ int32_t l_275 = 0x343AA78CL;
+ int32_t l_277 = 0xE7E876F0L;
+ int32_t l_289 = 0x3867B030L;
+ int32_t l_290 = 0x04B24578L;
+ int32_t l_291 = (-6L);
+ int32_t l_292 = 0xE153FDD8L;
+ int i;
+lbl_256:
+ if (((+0x7E10L) ^ ((l_176 != (((*g_69) &= (*l_182)) , &l_177)) || (*l_178))))
+ { /* block id: 108 */
+ uint32_t l_193 = 18446744073709551606UL;
+ int32_t l_194 = 3L;
+ for (g_78 = 0; (g_78 <= (-16)); g_78 = safe_sub_func_int32_t_s_s(g_78, 2))
+ { /* block id: 111 */
+ int8_t l_192 = 0L;
+ for (g_34 = 0; (g_34 <= 7); g_34 += 1)
+ { /* block id: 114 */
+ return (*l_178);
+ }
+ for (p_32 = 25; (p_32 == (-30)); p_32 = safe_sub_func_int32_t_s_s(p_32, 2))
+ { /* block id: 119 */
+ for (g_163.f0 = 0; (g_163.f0 != (-23)); g_163.f0 = safe_sub_func_int16_t_s_s(g_163.f0, 4))
+ { /* block id: 122 */
+ int8_t l_189 = (-3L);
+ for (g_34 = 0; (g_34 <= 3); g_34 += 1)
+ { /* block id: 125 */
+ (*l_176) = &g_84;
+ }
+ if (l_189)
+ break;
+ }
+ if ((*l_178))
+ break;
+ }
+ (*l_178) = (*p_31);
+ for (g_70 = 0; (g_70 < 3); ++g_70)
+ { /* block id: 135 */
+ l_192 = 0x42813DB6L;
+ }
+ }
+ for (p_32 = 7; (p_32 >= 0); p_32 -= 1)
+ { /* block id: 141 */
+ return p_30.f0;
+ }
+ l_194 = (~l_193);
+ return l_194;
+ }
+ else
+ { /* block id: 146 */
+ int8_t l_197[10] = {1L,0x3CL,1L,(-1L),(-1L),1L,0x3CL,1L,(-1L),(-1L)};
+ int32_t *l_198 = &g_61[3][1][1];
+ union U0 l_199[1] = {{0xDFL}};
+ int32_t *l_200 = (void*)0;
+ union U2 l_201[10] = {{0x8373BB44L},{0x8373BB44L},{0x8373BB44L},{0x8373BB44L},{0x8373BB44L},{0x8373BB44L},{0x8373BB44L},{0x8373BB44L},{0x8373BB44L},{0x8373BB44L}};
+ uint16_t *l_224 = &g_34;
+ uint8_t *l_232 = (void*)0;
+ uint8_t ** const l_231 = &l_232;
+ union U1 l_240 = {0};
+ int i;
+ if (((*l_178) = (safe_mul_func_uint16_t_u_u(((l_197[9] && func_50(l_198, (*l_182), (l_199[0] , p_30.f2), l_200, l_201[2])) >= (safe_mul_func_int8_t_s_s((*l_178), 0x2EL))), (*l_198)))))
+ { /* block id: 148 */
+ return (*l_198);
+ }
+ else
+ { /* block id: 150 */
+ uint8_t l_204 = 0xA3L;
+ uint32_t *l_217[3];
+ union U2 l_223 = {0x3A80E33CL};
+ uint16_t **l_225 = &l_224;
+ int i;
+ for (i = 0; i < 3; i++)
+ l_217[i] = &l_201[2].f1;
+lbl_226:
+ l_204--;
+ if (g_42.f3)
+ goto lbl_256;
+ if (((*l_178) = (safe_sub_func_uint8_t_u_u((safe_add_func_uint16_t_u_u(g_42.f1, (g_165[6] = ((*l_198) >= ((safe_add_func_int32_t_s_s(0xBBEC7243L, (safe_lshift_func_int8_t_s_u(((((safe_mul_func_uint16_t_u_u(1UL, (*l_198))) < (++g_218)) && ((*g_170) ^ ((*g_69) = (safe_add_func_uint8_t_u_u(0UL, (l_223 , (((*l_225) = l_224) == &g_34))))))) == 0UL), (*g_170))))) , 0xACD3L))))), (*l_198)))))
+ { /* block id: 157 */
+ return (*l_182);
+ }
+ else
+ { /* block id: 159 */
+ int16_t *l_233 = &g_234;
+ int32_t l_235 = (-9L);
+ if (g_218)
+ goto lbl_226;
+ (*l_198) = (func_50(((*g_95) = l_217[0]), g_61[0][4][3], ((((safe_add_func_uint32_t_u_u(g_42.f3, (p_30 , (((*l_224) ^= (*l_182)) ^ g_163.f0)))) , (((*l_198) | ((((*l_233) = ((safe_add_func_uint16_t_u_u((((l_231 == &g_170) && 1L) != p_28), 0x6AFEL)) , p_30.f3)) , (*g_69)) > (*l_178))) ^ 0xE3L)) == (*g_69)) > l_235), l_178, g_42) , 0x23B8671DL);
+ }
+ }
+ for (g_117 = (-4); (g_117 <= 25); ++g_117)
+ { /* block id: 169 */
+ int16_t *l_245 = &g_246;
+ int16_t **l_247[2];
+ int32_t *l_250 = &g_61[3][1][1];
+ int32_t l_253[6] = {0x4B38AC99L,0x4B38AC99L,0x12668D6FL,0x4B38AC99L,0x4B38AC99L,0x12668D6FL};
+ int32_t *l_254 = &g_255;
+ int i;
+ for (i = 0; i < 2; i++)
+ l_247[i] = &l_245;
+ }
+ }
+ for (p_32 = 0; (p_32 > (-13)); p_32 = safe_sub_func_int32_t_s_s(p_32, 5))
+ { /* block id: 181 */
+ uint8_t l_264 = 0x45L;
+ int32_t l_272 = (-8L);
+ int32_t l_287[1][4] = {{0L,0L,0L,0L}};
+ int16_t l_288 = (-1L);
+ uint32_t l_293 = 0xA6770327L;
+ int i, j;
+ for (p_28 = 1; (p_28 <= 7); p_28 += 1)
+ { /* block id: 184 */
+ const union U1 *l_263[9] = {&g_84,&g_84,&g_84,&g_84,&g_84,&g_84,&g_84,&g_84,&g_84};
+ int32_t l_265 = 0x3B5E6BF7L;
+ uint32_t *l_268 = &l_252.f1;
+ int16_t *l_271 = &g_234;
+ int32_t l_273 = 0x7167734CL;
+ int32_t *l_274 = (void*)0;
+ int32_t *l_276 = &g_255;
+ int32_t *l_278 = &l_273;
+ int32_t *l_279 = &g_255;
+ int32_t *l_280 = (void*)0;
+ int32_t *l_281 = &g_61[4][3][1];
+ int32_t *l_282 = &l_275;
+ int32_t *l_283 = &l_265;
+ int32_t *l_284 = &l_275;
+ int32_t *l_285 = &l_277;
+ int32_t *l_286[9][2] = {{&l_275,&g_255},{&g_61[3][1][1],&g_61[3][1][1]},{&g_255,&l_275},{&g_61[4][1][1],&l_275},{&g_255,&g_61[3][1][1]},{&g_61[3][1][1],&g_255},{&l_275,&g_255},{&l_265,&l_275},{&g_255,&g_255}};
+ int i, j;
+ l_273 |= ((p_32 ^ (p_32 != (safe_lshift_func_uint16_t_u_u(((safe_rshift_func_uint16_t_u_s((((void*)0 != l_263[4]) != ((*l_177) , (l_264 = ((g_42.f1 = p_28) | (*p_31))))), 14)) | l_265), ((safe_add_func_uint16_t_u_u(((++(*l_268)) , (((*l_271) ^= (*g_248)) <= l_272)), (*g_249))) || l_272))))) || 0x9B2CL);
+ if ((*l_182))
+ continue;
+ l_293++;
+ (*l_182) |= l_272;
+ }
+ }
+ return (*l_182);
+}
+
+
+/* ------------------------------------------ */
+/*
+ * reads : g_117 g_163 g_61 g_69 g_70 g_42 g_42.f3
+ * writes: g_170 g_61 g_60
+ */
+static int32_t * func_37(const uint16_t p_38, union U2 p_39, int32_t * p_40, int32_t p_41)
+{ /* block id: 101 */
+ int32_t ***l_159 = &g_95;
+ int32_t l_160 = 0x1B0D62F1L;
+ uint16_t *l_164 = &g_165[4];
+ const uint8_t *l_168 = &g_163.f1;
+ const uint8_t **l_169[5];
+ const uint8_t l_172[4] = {0x82L,0x82L,0x82L,0x82L};
+ int32_t *l_173 = &g_61[3][1][1];
+ uint32_t l_174 = 18446744073709551614UL;
+ int i;
+ for (i = 0; i < 5; i++)
+ l_169[i] = &l_168;
+ (*l_173) = ((safe_div_func_uint8_t_u_u(p_39.f3, (safe_lshift_func_int16_t_s_u(g_117, ((((void*)0 != l_159) <= l_160) == (safe_lshift_func_int16_t_s_u((((g_163 , l_164) == &p_38) && (safe_lshift_func_uint16_t_u_s(((g_170 = l_168) != (void*)0), 0))), 6))))))) >= l_172[3]);
+ (*l_173) = ((*l_173) & ((func_50(p_40, ((*g_69) , l_174), (*g_69), &l_160, g_42) != (g_61[7][0][3] , p_39.f2)) <= 0xEEL));
+ return p_40;
+}
+
+
+/* ------------------------------------------ */
+/*
+ * reads : g_69 g_70 g_61 g_60 g_42.f3 g_42.f2 g_78 g_94 g_23 g_117 g_95
+ * writes: g_78 g_61 g_60 g_117
+ */
+static int32_t * func_43(uint8_t p_44, int8_t p_45, int8_t * p_46)
+{ /* block id: 15 */
+ int32_t *l_71 = &g_61[3][1][1];
+ int32_t *l_72 = (void*)0;
+ int32_t *l_73[9][8] = {{&g_61[3][1][1],(void*)0,(void*)0,&g_61[1][4][3],&g_61[0][3][1],&g_61[4][3][1],&g_61[6][4][2],&g_61[4][2][0]},{&g_61[2][4][2],(void*)0,(void*)0,&g_61[0][3][1],&g_61[0][3][1],(void*)0,(void*)0,&g_61[2][4][2]},{&g_61[3][1][1],&g_61[2][4][2],&g_61[3][1][2],&g_61[4][2][0],(void*)0,(void*)0,(void*)0,&g_61[1][2][0]},{(void*)0,(void*)0,(void*)0,(void*)0,&g_61[4][2][0],(void*)0,(void*)0,(void*)0},{&g_61[4][3][1],&g_61[2][4][2],&g_61[1][2][0],&g_61[3][0][0],&g_61[3][1][1],(void*)0,(void*)0,(void*)0},{(void*)0,(void*)0,&g_61[0][3][1],(void*)0,&g_61[4][3][1],&g_61[4][3][1],(void*)0,&g_61[0][3][1]},{(void*)0,(void*)0,&g_61[1][2][0],(void*)0,&g_61[1][4][3],&g_61[3][1][2],(void*)0,(void*)0},{&g_61[1][4][3],&g_61[3][1][2],(void*)0,(void*)0,(void*)0,&g_61[0][3][1],(void*)0,(void*)0},{&g_61[3][1][2],&g_61[1][2][0],&g_61[3][1][2],(void*)0,&g_61[6][4][2],(void*)0,(void*)0,&g_61[0][3][1]}};
+ uint32_t l_74 = 0xFA7F9CD9L;
+ int32_t *l_77 = &g_78;
+ int32_t l_79 = 1L;
+ union U1 *l_86[5];
+ int32_t ***l_96 = &g_95;
+ int8_t l_106 = 8L;
+ int8_t l_119[6] = {9L,0L,9L,9L,0L,9L};
+ union U2 l_120 = {-5L};
+ int32_t *l_134 = &g_61[3][1][1];
+ int i, j;
+ for (i = 0; i < 5; i++)
+ l_86[i] = &g_84;
+lbl_87:
+ l_74--;
+ l_79 ^= (((*l_77) = ((*g_69) || ((*l_71) < 0x14A1L))) , (*g_60));
+ if ((g_42.f3 <= (1UL & (0xF049L <= g_42.f2))))
+ { /* block id: 19 */
+ union U1 *l_83 = &g_84;
+ int32_t l_90 = 0L;
+ for (p_45 = 0; (p_45 < (-22)); p_45--)
+ { /* block id: 22 */
+ int32_t *l_88 = &g_61[3][1][1];
+ for (l_79 = 6; (l_79 >= 0); l_79 -= 1)
+ { /* block id: 25 */
+ int i, j;
+ l_73[(l_79 + 1)][l_79] = l_73[l_79][(l_79 + 1)];
+ if (p_45)
+ { /* block id: 27 */
+ const int16_t l_82 = (-10L);
+ for (g_78 = 7; (g_78 >= 0); g_78 -= 1)
+ { /* block id: 30 */
+ union U1 **l_85[4] = {(void*)0,(void*)0,(void*)0,(void*)0};
+ int i;
+ (*g_60) = l_82;
+ l_86[4] = ((p_45 <= g_70) , l_83);
+ }
+ if (g_42.f3)
+ goto lbl_87;
+ return l_88;
+ }
+ else
+ { /* block id: 36 */
+ int32_t l_89 = 1L;
+ int i, j;
+ l_73[(l_79 + 1)][(l_79 + 1)] = (l_89 , l_73[l_79][(l_79 + 1)]);
+ if (p_44)
+ break;
+ }
+ }
+ if (l_90)
+ break;
+ (*l_71) |= (safe_lshift_func_int8_t_s_s(l_90, 2));
+ }
+ }
+ else
+ { /* block id: 44 */
+ int32_t l_93 = 0x63BE35A8L;
+ int32_t l_98 = (-9L);
+ int32_t l_99 = 0xE0221BC3L;
+ int32_t l_100 = 0xE0F627EEL;
+ int32_t l_103 = 7L;
+ int32_t l_104 = 0xBAAC5CA8L;
+ int32_t l_105 = 0xA126CF24L;
+ union U2 l_115 = {4L};
+ int32_t *l_128 = &l_93;
+ int32_t *l_133 = &l_100;
+ if ((((l_93 , g_94[0]) != l_96) <= 5L))
+ { /* block id: 45 */
+ int32_t l_97 = 0xA0849DA6L;
+ int32_t l_101 = 1L;
+ int32_t l_102[5] = {(-1L),(-1L),(-1L),(-1L),(-1L)};
+ uint8_t l_107 = 8UL;
+ int32_t *l_112 = &l_99;
+ uint8_t *l_116[10][4][4] = {{{&l_107,&l_107,&g_23,&l_115.f2},{&g_42.f2,&g_23,(void*)0,&l_107},{&g_42.f2,(void*)0,&g_23,&g_42.f2},{&l_107,&l_115.f2,(void*)0,&l_115.f2}},{{(void*)0,&l_115.f2,(void*)0,&g_42.f2},{&l_107,(void*)0,(void*)0,&l_107},{&l_107,&g_23,(void*)0,&l_115.f2},{&l_107,&l_107,(void*)0,(void*)0}},{{(void*)0,(void*)0,(void*)0,(void*)0},{&l_107,&l_107,&g_23,&l_115.f2},{&g_42.f2,&g_23,(void*)0,&l_107},{&g_42.f2,(void*)0,&g_23,&g_42.f2}},{{&l_107,&l_115.f2,(void*)0,&l_115.f2},{(void*)0,&l_115.f2,(void*)0,&g_42.f2},{&l_107,(void*)0,(void*)0,&l_107},{&l_107,&g_23,(void*)0,&l_115.f2}},{{&l_107,&l_107,(void*)0,(void*)0},{(void*)0,(void*)0,(void*)0,(void*)0},{&l_107,&l_107,&g_23,&l_115.f2},{&g_42.f2,&g_23,(void*)0,&l_107}},{{&g_42.f2,(void*)0,&g_23,&g_42.f2},{&l_107,&l_115.f2,(void*)0,&l_115.f2},{(void*)0,&l_115.f2,(void*)0,&g_42.f2},{&l_107,(void*)0,(void*)0,&g_42.f2}},{{&l_115.f2,&l_107,(void*)0,&g_23},{&g_42.f2,&l_115.f2,&l_107,&l_107},{&l_107,(void*)0,&g_23,&l_107},{&l_115.f2,&l_115.f2,(void*)0,&g_23}},{{(void*)0,&l_107,&l_107,&g_42.f2},{(void*)0,(void*)0,(void*)0,(void*)0},{&l_115.f2,&g_23,&g_23,&g_23},{&l_107,&g_23,&l_107,(void*)0}},{{&g_42.f2,(void*)0,(void*)0,&g_42.f2},{&l_115.f2,&l_107,(void*)0,&g_23},{&g_42.f2,&l_115.f2,&l_107,&l_107},{&l_107,(void*)0,&g_23,&l_107}},{{&l_115.f2,&l_115.f2,(void*)0,&g_23},{(void*)0,&l_107,&l_107,&g_42.f2},{(void*)0,(void*)0,(void*)0,(void*)0},{&l_115.f2,&g_23,&g_23,&g_23}}};
+ int8_t *l_118 = &l_106;
+ union U2 l_121 = {0xF3683EEDL};
+ uint32_t l_123 = 0x382ABCCDL;
+ int32_t *l_131 = &l_104;
+ int i, j, k;
+ l_107--;
+ l_101 &= ((safe_mod_func_int8_t_s_s((*p_46), (-1L))) == func_50(l_112, l_99, (safe_sub_func_int16_t_s_s(((0xD7L ^ (func_50(&l_99, g_42.f3, (((*l_118) = ((((g_117 |= (func_50(&l_102[2], (g_78 , g_23), (*g_69), &l_100, l_115) > g_42.f2)) , p_45) || 0x8DL) <= (-1L))) , l_119[2]), &l_101, l_120) , l_115.f2)) && 65535UL), 0x1D2AL)), &l_93, l_121));
+ if (p_44)
+ { /* block id: 50 */
+ int8_t l_122 = 1L;
+ union U2 *l_127[5] = {(void*)0,(void*)0,(void*)0,(void*)0,(void*)0};
+ union U2 **l_126 = &l_127[3];
+ int32_t *l_129 = &l_102[2];
+ int32_t *l_130 = &l_104;
+ int32_t *l_132 = &l_101;
+ int i;
+ l_123--;
+ (*l_126) = &g_42;
+ return l_134;
+ }
+ else
+ { /* block id: 54 */
+ uint16_t l_135 = 65535UL;
+ int32_t l_138 = (-1L);
+ if ((0L == 1L))
+ { /* block id: 55 */
+ for (l_98 = 5; (l_98 >= 1); l_98 -= 1)
+ { /* block id: 58 */
+ int i;
+ if (l_119[l_98])
+ break;
+ }
+ ++l_135;
+ }
+ else
+ { /* block id: 62 */
+ int8_t l_142[10][6][4] = {{{0x71L,(-2L),0xA5L,0x84L},{(-9L),(-2L),0x0DL,1L},{0x80L,0L,0x3EL,5L},{0x71L,1L,9L,1L},{0x97L,(-4L),0x4CL,0x5CL},{0x45L,0x38L,0x71L,0xF5L}},{{0xA5L,0xA5L,1L,1L},{0L,0L,0x97L,(-1L)},{0x85L,0xBBL,0xE4L,0x3EL},{6L,0L,1L,0xE4L},{(-8L),0L,5L,0x3EL},{0L,0xBBL,(-1L),(-1L)}},{{0x4CL,0L,(-1L),1L},{0x84L,0xA5L,(-2L),0x71L},{(-1L),0x6FL,6L,8L},{1L,0x9DL,0x83L,0xFBL},{0L,0xDAL,(-2L),0L},{0x85L,0xF9L,1L,0xDAL}},{{0x18L,7L,0x4CL,0x83L},{0x78L,0x16L,(-2L),0x3EL},{0L,0x6DL,0x72L,0L},{1L,1L,(-1L),(-1L)},{0L,0x97L,(-2L),(-8L)},{0xA4L,(-1L),0x18L,0xA4L}},{{0x4CL,0xA5L,0x25L,0x97L},{1L,0xDAL,5L,0x31L},{9L,1L,0x83L,0x38L},{6L,0x84L,0x0DL,0x97L},{0x78L,1L,0x97L,0xDAL},{7L,(-1L),0x6FL,(-1L)}},{{0x1CL,(-8L),0x34L,0xB9L},{0x3EL,0x16L,1L,0x16L},{7L,0x34L,(-1L),0x31L},{0x8BL,(-1L),0x6FL,(-1L)},{(-1L),0x9DL,(-3L),1L},{(-1L),0L,0x6FL,0x78L}},{{0x8BL,1L,(-1L),9L},{7L,0L,1L,0x71L},{0x3EL,0x0DL,0x34L,0x85L},{1L,8L,0x0DL,0x6DL},{0x3EL,1L,(-7L),7L},{0x84L,1L,0x8BL,0x31L}},{{(-1L),0x16L,(-1L),0xBBL},{0L,0x97L,0x15L,0x38L},{0x97L,1L,0x6FL,0L},{0xE4L,0x3EL,0L,0x6DL},{0L,0x38L,0x5CL,0x78L},{0L,0x0DL,0L,0x03L}},{{0L,0x39L,0x18L,9L},{0x3EL,0L,(-9L),0xF8L},{0x84L,0L,0xE4L,0L},{0L,1L,0x6DL,(-1L)},{0xA4L,(-8L),(-9L),0x38L},{0xA5L,0x34L,(-1L),0x97L}},{{0x15L,1L,(-7L),0x1CL},{0L,(-1L),9L,0L},{(-1L),0x80L,0x80L,(-1L)},{1L,0x4CL,0x0BL,(-4L)},{1L,0L,0x85L,0xE4L},{(-1L),0x4FL,0x15L,0xE4L}}};
+ int i, j, k;
+ if (((*g_60) = (**g_95)))
+ { /* block id: 64 */
+ (*l_134) = (p_44 , func_50((**l_96), (*l_133), l_135, (**l_96), l_120));
+ l_138 = ((l_133 != (void*)0) & p_45);
+ }
+ else
+ { /* block id: 67 */
+ int32_t *l_141[6] = {&l_102[1],&l_102[1],&l_102[1],&l_102[1],&l_102[1],&l_102[1]};
+ int i;
+ (*l_131) &= (*l_134);
+ (***l_96) = ((safe_rshift_func_uint8_t_u_s((p_44 = (((void*)0 == l_141[2]) , (l_142[0][3][1] = (*l_112)))), (*g_69))) || (-8L));
+ (*l_134) |= p_44;
+ }
+ }
+ for (l_107 = 0; (l_107 <= 37); l_107++)
+ { /* block id: 77 */
+ (**g_95) = (((p_44++) , (&g_95 == (void*)0)) & (*g_69));
+ for (l_93 = 0; l_93 < 6; l_93 += 1)
+ {
+ l_119[l_93] = 0xC6L;
+ }
+ }
+ for (l_100 = 4; (l_100 >= 0); l_100 -= 1)
+ { /* block id: 84 */
+ int32_t *l_147 = &l_104;
+ int32_t *l_148 = (void*)0;
+ return l_148;
+ }
+ (*g_95) = (**l_96);
+ }
+ for (g_117 = 0; (g_117 != (-14)); g_117--)
+ { /* block id: 91 */
+ uint32_t l_151 = 0x6CEBD2D5L;
+ int32_t l_154 = 0x9DA40672L;
+ ++l_151;
+ l_154 = (p_45 >= (*l_133));
+ }
+ }
+ else
+ { /* block id: 95 */
+ return (*g_95);
+ }
+ }
+ (*l_71) |= (-1L);
+ return l_73[2][6];
+}
+
+
+/* ------------------------------------------ */
+/*
+ * reads : g_42.f3
+ * writes: g_60
+ */
+static uint16_t func_50(int32_t * p_51, uint16_t p_52, int8_t p_53, int32_t * p_54, union U2 p_55)
+{ /* block id: 8 */
+ for (p_53 = 0; (p_53 < (-11)); p_53 = safe_sub_func_uint8_t_u_u(p_53, 9))
+ { /* block id: 11 */
+ int32_t **l_67 = (void*)0;
+ int32_t **l_68 = &g_60;
+ (*l_68) = p_54;
+ }
+ return g_42.f3;
+}
+
+
+/* ------------------------------------------ */
+/*
+ * reads :
+ * writes:
+ */
+static int32_t * func_56(int8_t * p_57, int32_t * p_58)
+{ /* block id: 5 */
+ int32_t **l_62 = (void*)0;
+ int32_t ***l_63 = &l_62;
+ (*l_63) = l_62;
+ return p_58;
+}
+
+
+
+
+/* ---------------------------------------- */
+int main (int argc, char* argv[])
+{
+ int i, j, k;
+ int print_hash_value = 0;
+ if (argc == 2 && strcmp(argv[1], "1") == 0) print_hash_value = 1;
+ platform_main_begin();
+ crc32_gentab();
+ func_1();
+ transparent_crc(g_23, "g_23", print_hash_value);
+ transparent_crc(g_25, "g_25", print_hash_value);
+ transparent_crc(g_34, "g_34", print_hash_value);
+ transparent_crc(g_42.f2, "g_42.f2", print_hash_value);
+ for (i = 0; i < 8; i++)
+ {
+ for (j = 0; j < 6; j++)
+ {
+ for (k = 0; k < 4; k++)
+ {
+ transparent_crc(g_61[i][j][k], "g_61[i][j][k]", print_hash_value);
+ if (print_hash_value) printf("index = [%d][%d][%d]\n", i, j, k);
+
+ }
+ }
+ }
+ transparent_crc(g_70, "g_70", print_hash_value);
+ transparent_crc(g_78, "g_78", print_hash_value);
+ transparent_crc(g_117, "g_117", print_hash_value);
+ transparent_crc(g_163.f0, "g_163.f0", print_hash_value);
+ transparent_crc(g_163.f1, "g_163.f1", print_hash_value);
+ for (i = 0; i < 7; i++)
+ {
+ transparent_crc(g_165[i], "g_165[i]", print_hash_value);
+ if (print_hash_value) printf("index = [%d]\n", i);
+
+ }
+ for (i = 0; i < 4; i++)
+ {
+ for (j = 0; j < 8; j++)
+ {
+ for (k = 0; k < 3; k++)
+ {
+ transparent_crc(g_171[i][j][k], "g_171[i][j][k]", print_hash_value);
+ if (print_hash_value) printf("index = [%d][%d][%d]\n", i, j, k);
+
+ }
+ }
+ }
+ transparent_crc(g_218, "g_218", print_hash_value);
+ transparent_crc(g_234, "g_234", print_hash_value);
+ transparent_crc(g_246, "g_246", print_hash_value);
+ transparent_crc(g_255, "g_255", print_hash_value);
+ transparent_crc(g_380, "g_380", print_hash_value);
+ transparent_crc(g_387, "g_387", print_hash_value);
+ for (i = 0; i < 4; i++)
+ {
+ for (j = 0; j < 1; j++)
+ {
+ transparent_crc(g_405[i][j].f0, "g_405[i][j].f0", print_hash_value);
+ transparent_crc(g_405[i][j].f1, "g_405[i][j].f1", print_hash_value);
+ if (print_hash_value) printf("index = [%d][%d]\n", i, j);
+
+ }
+ }
+ transparent_crc(g_471, "g_471", print_hash_value);
+ transparent_crc(g_555, "g_555", print_hash_value);
+ for (i = 0; i < 9; i++)
+ {
+ transparent_crc(g_556[i], "g_556[i]", print_hash_value);
+ if (print_hash_value) printf("index = [%d]\n", i);
+
+ }
+ platform_main_end(crc32_context ^ 0xFFFFFFFFUL, print_hash_value);
+ return 0;
+}
+
+/************************ statistics *************************
+XXX max struct depth: 0
+breakdown:
+ depth: 0, occurrence: 231
+XXX total union variables: 28
+
+XXX non-zero bitfields defined in structs: 0
+XXX zero bitfields defined in structs: 0
+XXX const bitfields defined in structs: 0
+XXX volatile bitfields defined in structs: 0
+XXX structs with bitfields in the program: 0
+breakdown:
+XXX full-bitfields structs in the program: 0
+breakdown:
+XXX times a bitfields struct's address is taken: 0
+XXX times a bitfields struct on LHS: 0
+XXX times a bitfields struct on RHS: 0
+XXX times a single bitfield on LHS: 0
+XXX times a single bitfield on RHS: 0
+
+XXX max expression depth: 45
+breakdown:
+ depth: 1, occurrence: 161
+ depth: 2, occurrence: 47
+ depth: 3, occurrence: 4
+ depth: 4, occurrence: 3
+ depth: 5, occurrence: 2
+ depth: 6, occurrence: 1
+ depth: 7, occurrence: 2
+ depth: 10, occurrence: 2
+ depth: 11, occurrence: 1
+ depth: 12, occurrence: 1
+ depth: 14, occurrence: 2
+ depth: 15, occurrence: 1
+ depth: 16, occurrence: 2
+ depth: 17, occurrence: 1
+ depth: 18, occurrence: 1
+ depth: 19, occurrence: 1
+ depth: 20, occurrence: 1
+ depth: 25, occurrence: 1
+ depth: 27, occurrence: 1
+ depth: 28, occurrence: 1
+ depth: 30, occurrence: 1
+ depth: 34, occurrence: 1
+ depth: 45, occurrence: 1
+
+XXX total number of pointers: 222
+
+XXX times a variable address is taken: 413
+XXX times a pointer is dereferenced on RHS: 116
+breakdown:
+ depth: 1, occurrence: 105
+ depth: 2, occurrence: 10
+ depth: 3, occurrence: 1
+XXX times a pointer is dereferenced on LHS: 91
+breakdown:
+ depth: 1, occurrence: 89
+ depth: 2, occurrence: 1
+ depth: 3, occurrence: 1
+XXX times a pointer is compared with null: 9
+XXX times a pointer is compared with address of another variable: 1
+XXX times a pointer is compared with another pointer: 3
+XXX times a pointer is qualified to be dereferenced: 2461
+
+XXX max dereference level: 3
+breakdown:
+ level: 0, occurrence: 0
+ level: 1, occurrence: 541
+ level: 2, occurrence: 44
+ level: 3, occurrence: 6
+XXX number of pointers point to pointers: 37
+XXX number of pointers point to scalars: 174
+XXX number of pointers point to structs: 0
+XXX percent of pointers has null in alias set: 30.2
+XXX average alias set size: 1.65
+
+XXX times a non-volatile is read: 686
+XXX times a non-volatile is write: 318
+XXX times a volatile is read: 0
+XXX times read thru a pointer: 0
+XXX times a volatile is write: 0
+XXX times written thru a pointer: 0
+XXX times a volatile is available for access: 0
+XXX percentage of non-volatile access: 100
+
+XXX forward jumps: 1
+XXX backward jumps: 2
+
+XXX stmts: 167
+XXX max block depth: 5
+breakdown:
+ depth: 0, occurrence: 32
+ depth: 1, occurrence: 19
+ depth: 2, occurrence: 34
+ depth: 3, occurrence: 34
+ depth: 4, occurrence: 23
+ depth: 5, occurrence: 25
+
+XXX percentage a fresh-made variable is used: 17.7
+XXX percentage an existing variable is used: 82.3
+********************* end of statistics **********************/
+
diff --git a/tests/fuzz/3.c.txt b/tests/fuzz/3.c.txt
new file mode 100644
index 00000000..ab401bb1
--- /dev/null
+++ b/tests/fuzz/3.c.txt
@@ -0,0 +1 @@
+checksum = EE4B2FFC
diff --git a/tests/fuzz/4.c b/tests/fuzz/4.c
new file mode 100644
index 00000000..01949b54
--- /dev/null
+++ b/tests/fuzz/4.c
@@ -0,0 +1,216 @@
+/*
+ * This is a RANDOMLY GENERATED PROGRAM.
+ *
+ * Generator: csmith 2.2.0
+ * Git version: a8697aa
+ * Options: --no-volatiles --no-math64 --no-packed-struct --max-block-depth 2 --max-block-size 2 --max-expr-complexity 2 --max-funcs 2
+ * Seed: 3993484092
+ */
+
+#include "csmith.h"
+
+
+static long __undefined;
+
+/* --- Struct/Union Declarations --- */
+struct S0 {
+ int16_t f0;
+ const int8_t f1;
+ int32_t f2;
+ const uint8_t f3;
+ unsigned f4 : 27;
+ uint32_t f5;
+ const int32_t f6;
+ int8_t f7;
+ uint32_t f8;
+};
+
+/* --- GLOBAL VARIABLES --- */
+static int8_t g_5[8] = {0x8EL,0x8EL,0x8EL,0x8EL,0x8EL,0x8EL,0x8EL,0x8EL};
+static int8_t *g_4 = &g_5[7];
+static int32_t g_6[4][10] = {{0x158018D9L,1L,0L,0xA7EF5D87L,0xA7EF5D87L,0L,1L,0x158018D9L,0x158018D9L,1L},{0x158018D9L,0xA7EF5D87L,1L,1L,0xA7EF5D87L,0x158018D9L,0L,0L,0x158018D9L,0xA7EF5D87L},{0xA7EF5D87L,1L,1L,0xA7EF5D87L,0x158018D9L,0L,0L,0x158018D9L,0xA7EF5D87L,1L},{0xA7EF5D87L,0xA7EF5D87L,0L,1L,0x158018D9L,0x158018D9L,1L,0L,0xA7EF5D87L,0xA7EF5D87L}};
+static int32_t g_11 = 0L;
+static int32_t g_14[2][4] = {{0x69FF4CAAL,0x69FF4CAAL,0x69FF4CAAL,0x69FF4CAAL},{0x69FF4CAAL,0x69FF4CAAL,0x69FF4CAAL,0x69FF4CAAL}};
+static int32_t *g_13 = &g_14[0][0];
+static int32_t g_21 = 8L;
+
+
+/* --- FORWARD DECLARATIONS --- */
+static uint8_t func_1(void);
+static int32_t func_2(int8_t * p_3);
+
+
+/* --- FUNCTIONS --- */
+/* ------------------------------------------ */
+/*
+ * reads : g_4 g_6 g_11 g_21 g_14 g_5
+ * writes: g_6 g_11 g_13 g_14 g_21 g_5
+ */
+static uint8_t func_1(void)
+{ /* block id: 0 */
+ int32_t *l_18 = &g_14[0][0];
+ (*l_18) = func_2(g_4);
+ for (g_11 = 24; (g_11 > 9); g_11 = safe_sub_func_int8_t_s_s(g_11, 8))
+ { /* block id: 17 */
+ int32_t *l_24 = &g_21;
+ for (g_21 = (-6); (g_21 >= 8); g_21 = safe_add_func_int16_t_s_s(g_21, 9))
+ { /* block id: 20 */
+ (*l_18) ^= ((void*)0 == l_24);
+ (*l_18) = ((*l_24) ^ 1L);
+ }
+ for (g_21 = 5; (g_21 >= 0); g_21 -= 1)
+ { /* block id: 26 */
+ const struct S0 l_29[7][5] = {{{0xB1C2L,0x10L,0xA4AECA2AL,0x28L,485,4294967294UL,-1L,0x00L,0x971708C9L},{-5L,0xA5L,0x7FB6F8A3L,0UL,6341,1UL,0xA1BBDB81L,-1L,4294967286UL},{2L,7L,0x396434D1L,0xEAL,9469,0xEFE6B3E9L,0x2DA72DF2L,0x08L,9UL},{0x32E7L,-1L,-4L,5UL,7688,4294967292UL,0L,7L,7UL},{-5L,0xA5L,0x7FB6F8A3L,0UL,6341,1UL,0xA1BBDB81L,-1L,4294967286UL}},{{0xC6C8L,0xCDL,-8L,0xD2L,1855,0x1A504A86L,0x6A6C3430L,0L,0x372A7181L},{-2L,0x94L,-1L,255UL,5118,0UL,3L,0xBDL,2UL},{-10L,0x93L,1L,1UL,3983,4294967288UL,0xC0DB1B79L,7L,4294967293UL},{0x254FL,0xD2L,1L,1UL,8061,0xDF93C581L,0xDA77236CL,0x42L,1UL},{-2L,0x94L,-1L,255UL,5118,0UL,3L,0xBDL,2UL}},{{3L,0xC4L,0x293E9FC6L,255UL,4667,2UL,0x4CA9A92EL,8L,6UL},{0xB1C2L,0x10L,0xA4AECA2AL,0x28L,485,4294967294UL,-1L,0x00L,0x971708C9L},{2L,7L,0x396434D1L,0xEAL,9469,0xEFE6B3E9L,0x2DA72DF2L,0x08L,9UL},{-5L,0xA5L,0x7FB6F8A3L,0UL,6341,1UL,0xA1BBDB81L,-1L,4294967286UL},{-5L,0xA5L,0x7FB6F8A3L,0UL,6341,1UL,0xA1BBDB81L,-1L,4294967286UL}},{{-10L,0x93L,1L,1UL,3983,4294967288UL,0xC0DB1B79L,7L,4294967293UL},{0xC6C8L,0xCDL,-8L,0xD2L,1855,0x1A504A86L,0x6A6C3430L,0L,0x372A7181L},{0xAF73L,7L,0x2A224D52L,0x10L,5709,0UL,0x3A9A7891L,-1L,0x7C6C5FB3L},{-2L,0x94L,-1L,255UL,5118,0UL,3L,0xBDL,2UL},{-2L,0x94L,-1L,255UL,5118,0UL,3L,0xBDL,2UL}},{{2L,7L,0x396434D1L,0xEAL,9469,0xEFE6B3E9L,0x2DA72DF2L,0x08L,9UL},{3L,0xC4L,0x293E9FC6L,255UL,4667,2UL,0x4CA9A92EL,8L,6UL},{0x32E7L,-1L,-4L,5UL,7688,4294967292UL,0L,7L,7UL},{0xB1C2L,0x10L,0xA4AECA2AL,0x28L,485,4294967294UL,-1L,0x00L,0x971708C9L},{0xB1C2L,0x10L,0xA4AECA2AL,0x28L,485,4294967294UL,-1L,0x00L,0x971708C9L}},{{0xAF73L,7L,0x2A224D52L,0x10L,5709,0UL,0x3A9A7891L,-1L,0x7C6C5FB3L},{0xC6C8L,0xCDL,-8L,0xD2L,1855,0x1A504A86L,0x6A6C3430L,0L,0x372A7181L},{0x254FL,0xD2L,1L,1UL,8061,0xDF93C581L,0xDA77236CL,0x42L,1UL},{0xC6C8L,0xCDL,-8L,0xD2L,1855,0x1A504A86L,0x6A6C3430L,0L,0x372A7181L},{0xC6C8L,0xCDL,-8L,0xD2L,1855,0x1A504A86L,0x6A6C3430L,0L,0x372A7181L}},{{0x32E7L,-1L,-4L,5UL,7688,4294967292UL,0L,7L,7UL},{3L,0xC4L,0x293E9FC6L,255UL,4667,2UL,0x4CA9A92EL,8L,6UL},{-5L,0xA5L,0x7FB6F8A3L,0UL,6341,1UL,0xA1BBDB81L,-1L,4294967286UL},{0xB1C2L,0x10L,0xA4AECA2AL,0x28L,485,4294967294UL,-1L,0x00L,0x971708C9L},{3L,0xC4L,0x293E9FC6L,255UL,4667,2UL,0x4CA9A92EL,8L,6UL}}};
+ int i, j;
+ (*l_18) = (safe_mod_func_uint8_t_u_u((((safe_mul_func_int8_t_s_s((g_5[g_21] = (*g_4)), 0xFDL)) | g_14[1][2]) <= (*l_18)), 254UL));
+ (*l_18) = (((l_29[4][2] , (void*)0) != &g_14[0][0]) <= l_29[4][2].f1);
+ }
+ }
+ return (*l_18);
+}
+
+
+/* ------------------------------------------ */
+/*
+ * reads : g_6 g_11
+ * writes: g_6 g_11 g_13
+ */
+static int32_t func_2(int8_t * p_3)
+{ /* block id: 1 */
+ uint32_t l_15[4][3][4] = {{{0x1943EC3EL,8UL,1UL,0x58E7EA1BL},{0x1943EC3EL,2UL,0x58E7EA1BL,4294967292UL},{0UL,1UL,0UL,4294967293UL}},{{0x4898D08FL,1UL,0x4898D08FL,4294967292UL},{0UL,0x1943EC3EL,4294967292UL,0x4898D08FL},{2UL,4294967293UL,4294967292UL,0UL}},{{0UL,0x1943EC3EL,8UL,0x1943EC3EL},{4294967292UL,0x58E7EA1BL,0x1943EC3EL,0x1943EC3EL},{0x1943EC3EL,0x58E7EA1BL,0x4898D08FL,2UL}},{{1UL,0UL,8UL,8UL},{0x4898D08FL,1UL,8UL,0UL},{0x58E7EA1BL,4294967292UL,0x58E7EA1BL,0x1943EC3EL}}};
+ int i, j, k;
+ for (g_6[2][7] = (-24); (g_6[2][7] >= (-7)); g_6[2][7] = safe_add_func_uint32_t_u_u(g_6[2][7], 1))
+ { /* block id: 4 */
+ int32_t *l_9 = (void*)0;
+ int32_t *l_10 = &g_11;
+ (*l_10) &= 0x1B35D569L;
+ for (g_11 = 0; (g_11 <= 7); g_11 += 1)
+ { /* block id: 8 */
+ int32_t **l_12[6] = {&l_10,&l_10,&l_10,&l_10,&l_10,&l_10};
+ int i;
+ g_13 = l_9;
+ l_15[1][2][0]--;
+ }
+ }
+ return l_15[0][1][1];
+}
+
+
+
+
+/* ---------------------------------------- */
+int main (int argc, char* argv[])
+{
+ int i, j;
+ int print_hash_value = 0;
+ if (argc == 2 && strcmp(argv[1], "1") == 0) print_hash_value = 1;
+ platform_main_begin();
+ crc32_gentab();
+ func_1();
+ for (i = 0; i < 8; i++)
+ {
+ transparent_crc(g_5[i], "g_5[i]", print_hash_value);
+ if (print_hash_value) printf("index = [%d]\n", i);
+
+ }
+ for (i = 0; i < 4; i++)
+ {
+ for (j = 0; j < 10; j++)
+ {
+ transparent_crc(g_6[i][j], "g_6[i][j]", print_hash_value);
+ if (print_hash_value) printf("index = [%d][%d]\n", i, j);
+
+ }
+ }
+ transparent_crc(g_11, "g_11", print_hash_value);
+ for (i = 0; i < 2; i++)
+ {
+ for (j = 0; j < 4; j++)
+ {
+ transparent_crc(g_14[i][j], "g_14[i][j]", print_hash_value);
+ if (print_hash_value) printf("index = [%d][%d]\n", i, j);
+
+ }
+ }
+ transparent_crc(g_21, "g_21", print_hash_value);
+ platform_main_end(crc32_context ^ 0xFFFFFFFFUL, print_hash_value);
+ return 0;
+}
+
+/************************ statistics *************************
+XXX max struct depth: 1
+breakdown:
+ depth: 0, occurrence: 4
+ depth: 1, occurrence: 1
+XXX total union variables: 0
+
+XXX non-zero bitfields defined in structs: 1
+XXX zero bitfields defined in structs: 0
+XXX const bitfields defined in structs: 0
+XXX volatile bitfields defined in structs: 0
+XXX structs with bitfields in the program: 1
+breakdown:
+ indirect level: 0, occurrence: 1
+XXX full-bitfields structs in the program: 0
+breakdown:
+XXX times a bitfields struct's address is taken: 0
+XXX times a bitfields struct on LHS: 0
+XXX times a bitfields struct on RHS: 1
+XXX times a single bitfield on LHS: 0
+XXX times a single bitfield on RHS: 0
+
+XXX max expression depth: 6
+breakdown:
+ depth: 1, occurrence: 13
+ depth: 2, occurrence: 8
+ depth: 4, occurrence: 1
+ depth: 6, occurrence: 1
+
+XXX total number of pointers: 8
+
+XXX times a variable address is taken: 8
+XXX times a pointer is dereferenced on RHS: 4
+breakdown:
+ depth: 1, occurrence: 4
+XXX times a pointer is dereferenced on LHS: 6
+breakdown:
+ depth: 1, occurrence: 6
+XXX times a pointer is compared with null: 1
+XXX times a pointer is compared with address of another variable: 0
+XXX times a pointer is compared with another pointer: 0
+XXX times a pointer is qualified to be dereferenced: 39
+
+XXX max dereference level: 1
+breakdown:
+ level: 0, occurrence: 0
+ level: 1, occurrence: 16
+XXX number of pointers point to pointers: 1
+XXX number of pointers point to scalars: 7
+XXX number of pointers point to structs: 0
+XXX percent of pointers has null in alias set: 25
+XXX average alias set size: 1.12
+
+XXX times a non-volatile is read: 20
+XXX times a non-volatile is write: 20
+XXX times a volatile is read: 0
+XXX times read thru a pointer: 0
+XXX times a volatile is write: 0
+XXX times written thru a pointer: 0
+XXX times a volatile is available for access: 0
+XXX percentage of non-volatile access: 100
+
+XXX forward jumps: 0
+XXX backward jumps: 0
+
+XXX stmts: 15
+XXX max block depth: 2
+breakdown:
+ depth: 0, occurrence: 5
+ depth: 1, occurrence: 4
+ depth: 2, occurrence: 6
+
+XXX percentage a fresh-made variable is used: 23.8
+XXX percentage an existing variable is used: 76.2
+FYI: the random generator makes assumptions about the integer size. See platform.info for more details.
+********************* end of statistics **********************/
+
diff --git a/tests/fuzz/4.c.txt b/tests/fuzz/4.c.txt
new file mode 100644
index 00000000..f27bcce5
--- /dev/null
+++ b/tests/fuzz/4.c.txt
@@ -0,0 +1 @@
+checksum = 157CE2A8
diff --git a/tests/fuzz/5.c b/tests/fuzz/5.c
new file mode 100644
index 00000000..a62c18a3
--- /dev/null
+++ b/tests/fuzz/5.c
@@ -0,0 +1,13 @@
+#include <stdio.h>
+#include <string.h>
+
+int main(int argc, char **argv) {
+ printf("argc %d\n", argc);
+ char buffer[100];
+ for (int i = 0; i < 100; i++) buffer[i] = argc*(argc > 10 ? (argc*i) % 3 : (i*i));
+ memset(&buffer[10], -114, argc+25);
+ for(int i = 0; i < 100; i++) printf("%d:%d\n", i, buffer[i]);
+ //memset 5243040,-114,6,false,6
+ return buffer[15];
+}
+
diff --git a/tests/fuzz/5.c.txt b/tests/fuzz/5.c.txt
new file mode 100644
index 00000000..0c9d6dcd
--- /dev/null
+++ b/tests/fuzz/5.c.txt
@@ -0,0 +1,101 @@
+argc 1
+0:0
+1:1
+2:4
+3:9
+4:16
+5:25
+6:36
+7:49
+8:64
+9:81
+10:-114
+11:-114
+12:-114
+13:-114
+14:-114
+15:-114
+16:-114
+17:-114
+18:-114
+19:-114
+20:-114
+21:-114
+22:-114
+23:-114
+24:-114
+25:-114
+26:-114
+27:-114
+28:-114
+29:-114
+30:-114
+31:-114
+32:-114
+33:-114
+34:-114
+35:-114
+36:16
+37:89
+38:-92
+39:-15
+40:64
+41:-111
+42:-28
+43:57
+44:-112
+45:-23
+46:68
+47:-95
+48:0
+49:97
+50:-60
+51:41
+52:-112
+53:-7
+54:100
+55:-47
+56:64
+57:-79
+58:36
+59:-103
+60:16
+61:-119
+62:4
+63:-127
+64:0
+65:-127
+66:4
+67:-119
+68:16
+69:-103
+70:36
+71:-79
+72:64
+73:-47
+74:100
+75:-7
+76:-112
+77:41
+78:-60
+79:97
+80:0
+81:-95
+82:68
+83:-23
+84:-112
+85:57
+86:-28
+87:-111
+88:64
+89:-15
+90:-92
+91:89
+92:16
+93:-55
+94:-124
+95:65
+96:0
+97:-63
+98:-124
+99:73
diff --git a/tests/fuzz/7.c b/tests/fuzz/7.c
new file mode 100644
index 00000000..45c0096d
--- /dev/null
+++ b/tests/fuzz/7.c
@@ -0,0 +1,852 @@
+/*
+ * This is a RANDOMLY GENERATED PROGRAM.
+ *
+ * Generator: csmith 2.2.0
+ * Git version: a8697aa
+ * Options: --no-volatiles --no-math64 --no-packed-struct
+ * Seed: 4255021480
+ */
+
+#include "csmith.h"
+
+
+static long __undefined;
+
+/* --- Struct/Union Declarations --- */
+union U0 {
+ uint32_t f0;
+ uint32_t f1;
+ uint16_t f2;
+ int32_t f3;
+ int16_t f4;
+};
+
+union U1 {
+ int32_t f0;
+ int8_t f1;
+};
+
+union U2 {
+ signed f0 : 31;
+ uint8_t f1;
+};
+
+/* --- GLOBAL VARIABLES --- */
+static union U2 g_9[5] = {{5L},{5L},{5L},{5L},{5L}};
+static int32_t g_11 = 0xE5C285CEL;
+static const int32_t *g_16 = &g_11;
+static uint8_t g_66[1] = {0xC8L};
+static uint8_t g_71 = 255UL;
+static int32_t g_75 = 0xD78BEA8EL;
+static int8_t g_76[5] = {0x1AL,0x1AL,0x1AL,0x1AL,0x1AL};
+static int16_t g_77 = 0x065BL;
+static uint32_t g_78[7][9] = {{0x1A9F1398L,0xB1F15F1DL,0x4BD9F5B6L,0x1A9F1398L,0x8559CE79L,0xA768FB0CL,0xB1AAE879L,4294967293UL,0x8559CE79L},{0x8327BC4AL,0xF31BC463L,8UL,7UL,1UL,7UL,1UL,0x00823388L,1UL},{0x9C36DE1FL,0x19045039L,0xA768FB0CL,0x9C36DE1FL,0xB1F15F1DL,4294967293UL,4294967293UL,0x7078C3FCL,0x8559CE79L},{0x6E6AF575L,0x6E6AF575L,1UL,0x8327BC4AL,7UL,1UL,0x00823388L,0x00823388L,1UL},{0x8559CE79L,0x19045039L,0x9C36DE1FL,0x1A9F1398L,4294967293UL,0x9C36DE1FL,4294967291UL,4294967293UL,0xB1F15F1DL},{0x6E6AF575L,1UL,0x8327BC4AL,0x24791A13L,0x00823388L,1UL,0x24791A13L,0x6E6AF575L,7UL},{0x19045039L,0xA768FB0CL,0x19045039L,0x7078C3FCL,0x7078C3FCL,0xB1AAE879L,0x8559CE79L,0x7078C3FCL,0xA768FB0CL}};
+static int32_t *g_83[8][10] = {{&g_11,&g_11,&g_11,&g_11,&g_11,&g_11,&g_11,&g_11,&g_11,&g_11},{&g_11,&g_11,&g_11,&g_11,&g_11,&g_11,&g_11,&g_11,&g_11,&g_11},{&g_11,&g_11,&g_11,&g_11,&g_11,&g_11,&g_11,&g_11,&g_11,&g_11},{&g_11,&g_11,&g_11,&g_11,&g_11,&g_11,&g_11,&g_11,&g_11,&g_11},{&g_11,&g_11,&g_11,&g_11,&g_11,&g_11,&g_11,&g_11,&g_11,&g_11},{&g_11,&g_11,&g_11,&g_11,&g_11,&g_11,&g_11,&g_11,&g_11,&g_11},{&g_11,&g_11,&g_11,&g_11,&g_11,&g_11,&g_11,&g_11,&g_11,&g_11},{&g_11,&g_11,&g_11,&g_11,&g_11,&g_11,&g_11,&g_11,&g_11,&g_11}};
+static int32_t **g_82 = &g_83[0][9];
+static int32_t g_102 = 0xFD02F95CL;
+static uint16_t g_135 = 65534UL;
+static int32_t g_144 = 0x2D1F4F54L;
+static const uint16_t g_160 = 1UL;
+static union U0 g_181 = {4294967292UL};
+static union U0 *g_183 = &g_181;
+static union U1 g_202 = {0xD13A1308L};
+static union U1 *g_201 = &g_202;
+static int16_t g_209 = 2L;
+static int32_t g_211 = 0xAD8558D5L;
+static uint16_t g_231 = 65527UL;
+static union U1 *g_261 = &g_202;
+static union U2 *g_282 = (void*)0;
+static union U2 **g_281 = &g_282;
+static const int16_t g_328 = 2L;
+static int8_t g_390 = 0x65L;
+static int32_t g_468 = 0x425A7515L;
+static int32_t **g_537 = &g_83[6][2];
+static uint32_t g_547 = 0UL;
+static const uint32_t g_573 = 4294967288UL;
+static const uint32_t g_575 = 4294967291UL;
+static const uint32_t *g_574 = &g_575;
+static int16_t g_582 = 0x5594L;
+static union U0 **g_587 = &g_183;
+static union U0 ***g_586 = &g_587;
+static uint16_t *g_593 = &g_231;
+static uint16_t **g_592 = &g_593;
+static const union U1 g_649 = {-1L};
+static const union U1 *g_648 = &g_649;
+static int16_t g_666 = 0xB689L;
+static uint32_t g_668 = 2UL;
+static union U2 ***g_691 = &g_281;
+static union U2 *** const *g_690 = &g_691;
+static int32_t g_756 = 0x25866B22L;
+static uint8_t g_860 = 0x3DL;
+static uint16_t g_894 = 0xD1D4L;
+static const int32_t g_947 = 2L;
+static uint16_t g_966[5][3] = {{1UL,1UL,0x3378L},{1UL,1UL,1UL},{65535UL,0x3378L,1UL},{1UL,1UL,0x3378L},{1UL,0x3378L,65535UL}};
+static int8_t *g_1030 = (void*)0;
+static int8_t **g_1029 = &g_1030;
+static union U1 g_1059[9][9] = {{{2L},{9L},{1L},{9L},{2L},{2L},{2L},{1L},{1L}},{{5L},{0x9B1D2FFCL},{0x256D147CL},{0x9B1D2FFCL},{5L},{0x9B1D2FFCL},{5L},{0x256D147CL},{0x256D147CL}},{{9L},{2L},{2L},{2L},{9L},{1L},{9L},{2L},{9L}},{{0x9B1D2FFCL},{5L},{5L},{5L},{0x9B1D2FFCL},{0x256D147CL},{0x256D147CL},{5L},{0x9B1D2FFCL}},{{1L},{9L},{1L},{9L},{2L},{2L},{2L},{9L},{1L}},{{5L},{0x9B1D2FFCL},{0x256D147CL},{0x9B1D2FFCL},{5L},{5L},{5L},{0x256D147CL},{0x256D147CL}},{{9L},{1L},{2L},{2L},{9L},{1L},{9L},{2L},{2L}},{{0x9B1D2FFCL},{5L},{5L},{5L},{0x9B1D2FFCL},{0x256D147CL},{0x9B1D2FFCL},{5L},{0x9B1D2FFCL}},{{1L},{9L},{9L},{9L},{2L},{2L},{2L},{9L},{1L}}};
+static int32_t g_1124 = 0L;
+static int16_t g_1254 = 5L;
+static int32_t g_1294 = 0x5FC158E7L;
+static uint32_t *g_1326 = &g_78[4][2];
+static int16_t *g_1346[7] = {&g_209,&g_582,&g_209,&g_582,&g_1254,&g_1254,&g_1254};
+static union U0 *g_1354 = &g_181;
+static uint16_t g_1418 = 0x7548L;
+static int8_t * const **g_1432 = (void*)0;
+static union U1 **g_1483[6] = {&g_261,&g_261,&g_261,&g_261,&g_261,&g_261};
+static int8_t g_1501 = (-1L);
+static const int8_t *g_1582[8] = {(void*)0,(void*)0,(void*)0,&g_1059[4][2].f1,(void*)0,(void*)0,(void*)0,(void*)0};
+static const int8_t **g_1581 = &g_1582[6];
+static const int8_t ***g_1580 = &g_1581;
+static uint8_t g_1597 = 1UL;
+static int32_t g_1613 = 0L;
+static uint8_t **g_1628 = (void*)0;
+static int32_t ** const *g_1630 = &g_82;
+static int32_t ** const **g_1629 = &g_1630;
+static int16_t g_1665[1] = {(-8L)};
+
+
+/* --- FORWARD DECLARATIONS --- */
+static int16_t func_1(void);
+static const int32_t * func_2(uint8_t p_3, union U2 p_4, int32_t * p_5, union U0 p_6, const union U1 p_7);
+static int32_t func_19(int32_t p_20);
+static const union U1 func_23(const int32_t * p_24, int8_t p_25, uint8_t p_26, const union U0 p_27, const int32_t * p_28);
+static const int32_t * func_29(int32_t ** p_30, int32_t * p_31, int32_t * p_32, uint32_t p_33);
+static int32_t * func_36(int32_t ** p_37);
+static int32_t ** func_38(int16_t p_39, int8_t p_40, union U2 p_41, union U0 p_42);
+static int8_t func_45(uint8_t p_46, uint16_t p_47, union U2 p_48, int32_t ** p_49, const uint32_t p_50);
+static int8_t func_55(uint8_t p_56, union U1 p_57, int32_t * p_58, uint8_t p_59);
+static int32_t * func_61(int16_t p_62, const int32_t ** p_63);
+
+
+/* --- FUNCTIONS --- */
+/* ------------------------------------------ */
+/*
+ * reads : g_9 g_9.f0 g_11 g_16 g_66 g_71 g_78 g_82 g_77 g_181.f4 g_209 g_202.f0 g_181.f2 g_144 g_83 g_201 g_202 g_537 g_102 g_76 g_231 g_582 g_586 g_575 g_592 g_593 g_468 g_202.f1 g_261 g_649.f0 g_183 g_181 g_574 g_547 g_666 g_668 g_894 g_1124 g_587 g_181.f0 g_1630 g_281 g_282 g_690 g_691
+ * writes: g_16 g_66 g_71 g_78 g_76 g_181.f4 g_144 g_547 g_390 g_135 g_83 g_75 g_102 g_11 g_574 g_586 g_231 g_468 g_77 g_209 g_648 g_1124 g_181.f0 g_183 g_282 g_202
+ */
+static int16_t func_1(void)
+{ /* block id: 0 */
+ int8_t l_8 = 0xD2L;
+ int32_t *l_10 = &g_11;
+ union U0 l_12[3] = {{0xC63C4078L},{0xC63C4078L},{0xC63C4078L}};
+ const union U1 l_13 = {0x54DBBE56L};
+ const int32_t *l_15 = &l_12[2].f3;
+ const int32_t **l_14[1];
+ union U2 **l_1476[1];
+ union U1 ** const l_1484 = &g_261;
+ int16_t l_1489 = (-3L);
+ int32_t l_1490[4][9][7] = {{{0x7722092EL,0xE7360E5FL,0x6D151BE1L,6L,(-5L),8L,0x348F7672L},{0x09844A68L,(-1L),(-9L),1L,0xFFB9EB74L,0xB7C332CFL,0x6178C1E9L},{0L,0x4AEF49C4L,0x579BFEBAL,0x1115582EL,0x1724644DL,1L,0x9A5CF446L},{0xB336F930L,1L,1L,0L,0x3AF81339L,9L,0xB12F7DAAL},{0x61FAFD88L,6L,9L,0xA08F10A1L,0x06B6F60EL,0xFFB9EB74L,0xEAFC93F5L},{6L,0xA08F10A1L,0x06B6F60EL,(-8L),(-7L),0xB12F7DAAL,0xB4CB5279L},{(-5L),(-2L),0xBA853D88L,(-8L),0L,0xDE8A14BCL,0xE7360E5FL},{0xF7A455E7L,0x579BFEBAL,0xEAFC93F5L,0xA08F10A1L,0x1DE7A7EEL,0x348F7672L,(-1L)},{0x579BFEBAL,(-2L),0xDE8A14BCL,0L,0xCC05669DL,0xCC05669DL,0x1E6C6902L}},{{0x3AF81339L,(-7L),(-1L),0x1115582EL,(-2L),0xCB6A97FAL,(-5L)},{3L,(-1L),(-2L),1L,0xEAFC93F5L,0x781D787BL,0x85A2F7F1L},{0x1E6C6902L,0x781D787BL,(-9L),6L,1L,(-7L),1L},{0x579BFEBAL,8L,0x09844A68L,0xE7360E5FL,0x6178C1E9L,0x3AF81339L,1L},{0x348F7672L,(-1L),(-9L),0x566121C2L,4L,0x06B6F60EL,0xCC05669DL},{1L,0x9A5CF446L,(-2L),0L,0x1115582EL,0x1724644DL,0x1115582EL},{0x09844A68L,0x579BFEBAL,(-1L),0x1724644DL,0xC388F8C3L,0xF7A455E7L,0L},{9L,0xA34E9BADL,0xDE8A14BCL,0L,0xF7A455E7L,0x29ABAF8CL,(-1L)},{(-1L),1L,0xEAFC93F5L,1L,1L,2L,9L}},{{(-1L),0x1DE7A7EEL,3L,0x7BF25D80L,(-7L),9L,0x348F7672L},{0xEAFC93F5L,0x1DE7A7EEL,0x7722092EL,0xA34E9BADL,8L,9L,2L},{(-1L),1L,0x0CEE732EL,6L,2L,0x9E61483AL,0x9E61483AL},{0xBA853D88L,0xA34E9BADL,0x6EC18B86L,0xCE872C2BL,0xA34E9BADL,(-1L),0x3AF81339L},{(-7L),0x579BFEBAL,0L,5L,0xEB035C34L,0x6EC18B86L,0x7722092EL},{0x6D151BE1L,0xBBCB4E5FL,0xA34E9BADL,(-1L),(-1L),0xEAFC93F5L,9L},{1L,0x9E61483AL,0xB336F930L,0xAA26BCE5L,0x566121C2L,0x9E61483AL,0xEB035C34L},{2L,0x85A2F7F1L,0xEAC2EEC8L,0xEAFC93F5L,0xBBCB4E5FL,0xB4CB5279L,0x1E6C6902L},{1L,0xFFB9EB74L,0x7722092EL,(-1L),0x96B34700L,0x1FBA7239L,0xB336F930L}},{{0x6D151BE1L,0xC388F8C3L,0x1579862BL,0x06B6F60EL,0x1E6C6902L,0x06B6F60EL,2L},{(-7L),0x09844A68L,2L,0xB4CB5279L,5L,1L,(-1L)},{3L,2L,(-1L),0xEB035C34L,(-1L),0xC388F8C3L,0x85A2F7F1L},{0x4EC6A0E7L,0L,1L,0x3AF81339L,0x7BF25D80L,(-1L),0L},{(-1L),(-1L),0x3AF81339L,(-8L),4L,0x61FAFD88L,0L},{4L,0x929F3853L,0xCB6A97FAL,0L,0xAA26BCE5L,0xCE872C2BL,0x85A2F7F1L},{0x566121C2L,0x4AEF49C4L,6L,0x4EC6A0E7L,(-1L),(-1L),(-1L)},{0x61FAFD88L,0x29ABAF8CL,0xE7360E5FL,0xE7360E5FL,0L,(-2L),2L},{0xB4CB5279L,(-2L),0x1DE7A7EEL,0xE7360E5FL,0xDE8A14BCL,0L,(-8L)}}};
+ int32_t l_1499 = 0L;
+ int32_t l_1503 = 1L;
+ uint32_t l_1505[3][5][2] = {{{4294967289UL,1UL},{0UL,1UL},{4294967289UL,1UL},{0UL,1UL},{4294967289UL,1UL}},{{0UL,1UL},{4294967289UL,1UL},{0UL,1UL},{4294967289UL,1UL},{0UL,1UL}},{{4294967289UL,1UL},{0UL,1UL},{4294967289UL,1UL},{0UL,1UL},{4294967289UL,1UL}}};
+ int32_t l_1530 = (-3L);
+ int32_t l_1550 = 5L;
+ int32_t l_1557 = 5L;
+ union U1 *l_1563 = &g_1059[6][4];
+ uint32_t l_1622 = 0x24618042L;
+ uint16_t l_1656 = 1UL;
+ uint8_t *l_1682[9][4] = {{&g_66[0],&g_66[0],&g_66[0],&g_66[0]},{&g_66[0],&g_66[0],&g_66[0],&g_66[0]},{&g_66[0],&g_66[0],&g_66[0],&g_66[0]},{&g_66[0],&g_66[0],&g_66[0],&g_66[0]},{&g_66[0],&g_66[0],&g_66[0],&g_66[0]},{&g_66[0],&g_66[0],&g_66[0],&g_66[0]},{&g_66[0],&g_66[0],&g_66[0],&g_66[0]},{&g_66[0],&g_66[0],&g_66[0],&g_66[0]},{&g_66[0],&g_66[0],&g_66[0],&g_66[0]}};
+ uint8_t **l_1681 = &l_1682[8][2];
+ int32_t l_1684 = 0L;
+ int i, j, k;
+ for (i = 0; i < 1; i++)
+ l_14[i] = &l_15;
+ for (i = 0; i < 1; i++)
+ l_1476[i] = (void*)0;
+ g_16 = func_2(l_8, g_9[0], l_10, l_12[2], l_13);
+ for (l_8 = 0; (l_8 < 3); l_8 = safe_add_func_int16_t_s_s(l_8, 8))
+ { /* block id: 6 */
+ int32_t l_1456 = 0L;
+ int32_t l_1493 = (-5L);
+ int32_t l_1494 = 0xCC45616AL;
+ int32_t l_1498 = 0xF676537EL;
+ int32_t l_1502[5];
+ int8_t l_1525 = (-1L);
+ const int8_t l_1562 = 8L;
+ const uint32_t **l_1594 = &g_574;
+ union U1 l_1610 = {1L};
+ union U2 l_1654 = {2L};
+ uint32_t l_1685 = 0x72C9CEDCL;
+ int i;
+ for (i = 0; i < 5; i++)
+ l_1502[i] = (-1L);
+ if (func_19(g_9[0].f0))
+ { /* block id: 926 */
+ int8_t l_1454 = 0xD7L;
+ int32_t l_1457[6][4] = {{0x7FED4B30L,1L,0x7FED4B30L,1L},{0x7FED4B30L,1L,0x7FED4B30L,1L},{0x7FED4B30L,1L,0x7FED4B30L,1L},{0x7FED4B30L,1L,0x7FED4B30L,1L},{0x7FED4B30L,1L,0x7FED4B30L,1L},{0x7FED4B30L,1L,0x7FED4B30L,1L}};
+ const int32_t *l_1466 = &g_468;
+ uint16_t l_1488[6];
+ union U2 ***l_1529[9] = {&l_1476[0],&l_1476[0],&l_1476[0],&l_1476[0],&l_1476[0],&l_1476[0],&l_1476[0],&l_1476[0],&l_1476[0]};
+ int16_t l_1546 = 0x676EL;
+ const union U0 l_1565 = {4294967292UL};
+ union U1 *l_1571 = &g_1059[4][2];
+ uint32_t *l_1591 = &l_1505[0][0][0];
+ int8_t l_1658 = 3L;
+ int16_t l_1659 = 0xE414L;
+ uint32_t l_1660 = 0x579CC0EBL;
+ uint32_t l_1666 = 0xE040432BL;
+ uint32_t l_1671 = 0xF8DE41A5L;
+ union U1 *l_1672 = (void*)0;
+ union U1 *l_1673[3];
+ union U1 *l_1674 = &g_202;
+ int i, j;
+ for (i = 0; i < 6; i++)
+ l_1488[i] = 8UL;
+ for (i = 0; i < 3; i++)
+ l_1673[i] = (void*)0;
+ for (g_144 = 0; (g_144 <= 0); g_144 += 1)
+ { /* block id: 929 */
+ int16_t *l_1455[10] = {&l_12[2].f4,&l_12[2].f4,&l_12[2].f4,&l_12[2].f4,&l_12[2].f4,&l_12[2].f4,&l_12[2].f4,&l_12[2].f4,&l_12[2].f4,&l_12[2].f4};
+ uint8_t *l_1463 = &g_860;
+ const int32_t **l_1487 = &l_15;
+ int32_t l_1496 = (-2L);
+ int32_t l_1497 = 0xC7FAF769L;
+ union U2 l_1538 = {-1L};
+ const int8_t l_1539[6][6][7] = {{{0L,0x75L,2L,(-6L),(-6L),0xD3L,0x75L},{0x84L,0L,0x69L,0L,0x84L,0xF4L,7L},{0L,0L,0x75L,0xD3L,(-6L),0L,0x75L},{0xC1L,0x6CL,0x92L,0xF4L,0xC1L,0xF4L,0x92L},{1L,2L,0x75L,0L,(-6L),0xD3L,0xD3L},{0x84L,0L,7L,0xF4L,7L,0x6CL,0x84L}},{{1L,1L,0x75L,2L,0L,0L,0x75L},{0L,0L,0x92L,0x6CL,0L,0L,0L},{1L,0x75L,0xD3L,0L,(-6L),0x75L,0xD3L},{0x84L,0xF4L,0x84L,0L,0x84L,0L,7L},{(-6L),1L,0x75L,0x75L,0L,0L,2L},{0x92L,0x6CL,0xC1L,0L,0xC1L,0x6CL,0L}},{{(-6L),0xD3L,0xD3L,0L,1L,0x75L,0xD3L},{0x69L,0x6CL,7L,0x6CL,0x69L,0x6CL,0x69L},{(-6L),1L,2L,0x75L,0L,(-6L),0xD3L},{0L,0L,0L,0x6CL,0x92L,0x6CL,0xC1L},{0L,0xD3L,0xD3L,(-6L),0L,0x75L,0x75L},{7L,0xF4L,0x69L,0x6CL,0x84L,0xF4L,0x69L}},{{(-6L),0L,2L,0x75L,(-6L),1L,2L},{0x92L,0xF4L,0xC1L,0xF4L,0x92L,0xF4L,0x92L},{0L,0xD3L,0x75L,1L,1L,2L,2L},{0x69L,0L,0x69L,0xF4L,7L,0xF4L,0x69L},{1L,0L,2L,2L,1L,(-6L),0xD3L},{0xC1L,0L,0x92L,0xF4L,0L,0L,0x92L}},{{0L,0x75L,2L,(-6L),0L,0xD3L,0x75L},{0x84L,0L,0x84L,0L,7L,0xF4L,7L},{1L,0L,0xD3L,0xD3L,(-6L),1L,0x75L},{0x92L,0x6CL,0x92L,0L,0xC1L,0L,0x92L},{(-6L),0x75L,0x75L,1L,(-6L),2L,0xD3L},{0x84L,0x6CL,7L,0L,7L,0x6CL,7L}},{{1L,(-6L),0x75L,2L,1L,0L,0xD3L},{0L,0x6CL,0L,0x6CL,0xC1L,0L,0xC1L},{(-6L),0x75L,2L,0L,0L,0xD3L,0xD3L},{7L,0xF4L,7L,0L,0x84L,0x6CL,7L},{0L,1L,0xD3L,0xD3L,0L,1L,2L},{0L,0xF4L,0xC1L,0x6CL,0xC1L,0xF4L,0xC1L}}};
+ union U1 *l_1570 = &g_1059[4][2];
+ union U0 l_1593 = {1UL};
+ int i, j, k;
+ }
+ if ((*g_16))
+ { /* block id: 1007 */
+ union U1 *l_1599 = &g_1059[4][2];
+ int32_t l_1604 = 0L;
+ union U2 l_1625 = {0x22466E4EL};
+ uint8_t *l_1627 = (void*)0;
+ uint8_t **l_1626 = &l_1627;
+ uint32_t l_1631[4][8] = {{4294967287UL,1UL,4294967288UL,0x1CF551D9L,4294967287UL,0xFC67C7A4L,0UL,1UL},{4294967288UL,4294967288UL,0xD89884B8L,0x1CF551D9L,0xD89884B8L,4294967288UL,0xD89884B8L,4294967287UL},{0UL,0xFC67C7A4L,4294967287UL,4294967287UL,0xD89884B8L,0x8D4BD049L,1UL,4294967288UL},{0x8D4BD049L,4294967287UL,4294967287UL,1UL,0xFC67C7A4L,1UL,4294967287UL,1UL}};
+ int i, j;
+ for (g_71 = 0; (g_71 != 40); ++g_71)
+ { /* block id: 1010 */
+ const int32_t l_1606 = 1L;
+ }
+ }
+ else
+ { /* block id: 1031 */
+ int8_t l_1655 = 0x2AL;
+ union U2 l_1661 = {-9L};
+ int32_t *l_1662 = &l_12[2].f3;
+ int32_t *l_1663[9] = {&l_1493,&l_1493,&l_1493,&l_1493,&l_1493,&l_1493,&l_1493,&l_1493,&l_1493};
+ int32_t l_1664 = 0L;
+ int i;
+ for (g_181.f0 = (-24); (g_181.f0 <= 30); ++g_181.f0)
+ { /* block id: 1034 */
+ uint16_t l_1641 = 65535UL;
+ int8_t *l_1642[7] = {&l_1610.f1,(void*)0,&g_1059[4][2].f1,&g_1059[4][2].f1,&g_1059[4][2].f1,&l_1610.f1,&l_1610.f1};
+ int32_t l_1643 = 4L;
+ uint8_t *l_1657 = &l_1654.f1;
+ int i;
+ (*g_587) = &l_12[0];
+ g_16 = func_2(((((((void*)0 == (*g_1630)) >= (safe_mul_func_int8_t_s_s((l_1643 = l_1641), (((((safe_add_func_uint32_t_u_u((0L < ((safe_add_func_uint16_t_u_u((*g_593), 0xF41FL)) != (safe_sub_func_uint8_t_u_u(((*l_1657) = ((safe_div_func_uint16_t_u_u(((((func_45(l_1641, l_1493, (l_1654 = l_1654), &l_10, (*l_1466)) ^ l_1655) || 0x95L) >= l_1656) < (*g_593)), l_1610.f0)) == 0x3CL)), l_1658)))), l_1493)) , 6L) , (*l_15)) && l_1659) || l_1641)))) , l_1654.f1) , l_1502[1]) <= l_1660), l_1661, &l_1530, l_12[2], (*g_201));
+ if (l_1641)
+ continue;
+ }
+ (*l_10) ^= (*l_1466);
+ l_1666++;
+ if ((*l_10))
+ break;
+ }
+ for (g_547 = 0; (g_547 == 3); g_547 = safe_add_func_uint8_t_u_u(g_547, 8))
+ { /* block id: 1048 */
+ (***g_690) = (*g_281);
+ l_1493 ^= l_1494;
+ }
+ g_16 = func_2(l_1671, l_1654, &l_1503, l_12[2], ((*l_1674) = l_1610));
+ }
+ else
+ { /* block id: 1054 */
+ int8_t l_1683 = 0x9CL;
+ l_1502[1] = (safe_div_func_int32_t_s_s((safe_sub_func_int8_t_s_s(l_1562, (safe_rshift_func_uint16_t_u_u((1UL | (((void*)0 == l_1681) | (+l_1683))), 2)))), l_1684));
+ if (l_1610.f1)
+ continue;
+ }
+ return l_1685;
+ }
+ return (*l_10);
+}
+
+
+/* ------------------------------------------ */
+/*
+ * reads :
+ * writes:
+ */
+static const int32_t * func_2(uint8_t p_3, union U2 p_4, int32_t * p_5, union U0 p_6, const union U1 p_7)
+{ /* block id: 1 */
+ return &g_11;
+}
+
+
+/* ------------------------------------------ */
+/*
+ * reads : g_9.f0 g_11 g_16 g_66 g_71 g_78 g_9 g_82 g_77 g_181.f4 g_209 g_202.f0 g_181.f2 g_144 g_83 g_201 g_202 g_537 g_75 g_102 g_76 g_231 g_582 g_586 g_575 g_592 g_593 g_468 g_202.f1 g_261 g_649.f0 g_183 g_181 g_574 g_666 g_668 g_894 g_1124 g_587 g_547
+ * writes: g_16 g_66 g_71 g_78 g_76 g_181.f4 g_144 g_547 g_390 g_135 g_83 g_75 g_102 g_11 g_574 g_586 g_231 g_468 g_77 g_209 g_648 g_1124
+ */
+static int32_t func_19(int32_t p_20)
+{ /* block id: 7 */
+ int32_t *l_35 = &g_11;
+ int32_t **l_34 = &l_35;
+ union U1 l_60 = {0xAD4F6C55L};
+ int8_t *l_84 = &g_76[2];
+ union U2 l_85 = {-1L};
+ union U0 l_86 = {4294967295UL};
+ int32_t *l_1453 = &g_1124;
+ (*l_1453) |= ((safe_mod_func_uint8_t_u_u((func_23(func_29(l_34, (p_20 , func_36(func_38(g_9[0].f0, ((*l_84) = ((safe_mul_func_int16_t_s_s((((**l_34) && func_45(p_20, (safe_mod_func_uint32_t_u_u(((safe_lshift_func_int8_t_s_s(0xC8L, (func_55(p_20, l_60, func_61((((*g_16) && 0x04518073L) > 0x36L), &g_16), g_11) , (-1L)))) , p_20), g_9[0].f0)), g_9[3], g_82, p_20)) , (**l_34)), g_77)) || (**l_34))), l_85, l_86))), &g_468, p_20), p_20, p_20, l_86, (*l_34)) , 249UL), g_894)) > p_20);
+ (*l_35) = p_20;
+ (*g_537) = ((***g_586) , (*g_82));
+ return (*g_16);
+}
+
+
+/* ------------------------------------------ */
+/*
+ * reads : g_201 g_202
+ * writes:
+ */
+static const union U1 func_23(const int32_t * p_24, int8_t p_25, uint8_t p_26, const union U0 p_27, const int32_t * p_28)
+{ /* block id: 460 */
+ uint16_t l_675 = 0UL;
+ uint8_t *l_684 = &g_9[0].f1;
+ union U2 l_685 = {0x88367F2CL};
+ int32_t **l_686 = (void*)0;
+ int8_t *l_687[7];
+ int32_t l_688 = 0xF0B46BC5L;
+ union U0 ****l_689 = (void*)0;
+ const union U2 *l_695[6] = {&l_685,&l_685,&l_685,&l_685,&l_685,&l_685};
+ const union U2 **l_694 = &l_695[5];
+ const union U2 ***l_693 = &l_694;
+ const union U2 ****l_692 = &l_693;
+ int32_t *l_696 = &g_11;
+ int32_t *l_697 = &l_688;
+ union U0 **l_709 = &g_183;
+ int8_t * const *l_716 = (void*)0;
+ union U0 l_718 = {4294967292UL};
+ const union U1 l_725 = {0xCF474642L};
+ union U2 l_762 = {-3L};
+ union U0 l_770 = {4294967292UL};
+ int32_t l_810 = 0x0514C231L;
+ int32_t l_851[10] = {0L,0L,0L,0L,0L,0L,0L,0L,0L,0L};
+ int32_t l_867[5][10][3] = {{{0x9279772DL,(-1L),2L},{0x08D29043L,0xE1F44506L,0x08D29043L},{0xAAC8A26EL,0xE1B3EFFAL,(-3L)},{0xE1F44506L,1L,0x87B510FDL},{0x6D1F2783L,(-3L),0L},{0x27ECB6E8L,0xE8274EACL,0x08D29043L},{0x6D1F2783L,0xC659668AL,0xDCD37698L},{0x8C0733A2L,0x87B510FDL,6L},{0x2820589CL,0xB311FE06L,0x97A0EB8CL},{(-1L),0x4EAB465CL,0xB3893D4FL}},{{(-3L),(-1L),(-1L)},{0x411C5323L,0xBDBD4C74L,1L},{0xB311FE06L,0xDCD37698L,0xDCD37698L},{0x411C5323L,0x8C0733A2L,0xF779865EL},{0x2E256168L,2L,(-5L)},{0x63F4CD2EL,0xBDBD4C74L,0xF779865EL},{0xAAC8A26EL,1L,(-1L)},{1L,0x4EAB465CL,0x8C0733A2L},{(-1L),0xAAC8A26EL,(-1L)},{0x87B510FDL,(-2L),0xEEE97BECL}},{{(-3L),4L,0xC659668AL},{0x27ECB6E8L,0x903B8919L,(-1L)},{6L,(-7L),0xC659668AL},{0xE8274EACL,0xE1F44506L,0x4EAB465CL},{4L,0xC659668AL,0x7F0FCA53L},{0x27ECB6E8L,0x8C0733A2L,1L},{(-1L),0xAAC8A26EL,(-3L)},{(-2L),6L,0x4ED03EDAL},{0x124AF2F5L,(-3L),(-1L)},{1L,(-8L),0xEEE97BECL}},{{0x9279772DL,(-1L),0x9279772DL},{(-1L),0x87B510FDL,1L},{(-1L),0x7F0FCA53L,0L},{0x633BE4BDL,0x27ECB6E8L,0L},{0xAAC8A26EL,(-3L),(-5L)},{0x633BE4BDL,0x903B8919L,0x0402175AL},{2L,(-7L),(-1L)},{0xB3893D4FL,0xC995347EL,0x411C5323L},{(-3L),0x97A0EB8CL,0xDCD37698L},{4L,(-8L),0xB3893D4FL}},{{0xE1B3EFFAL,0xC659668AL,0x7F0FCA53L},{0xC995347EL,0xBB8ED630L,0x0402175AL},{0xE1B3EFFAL,2L,6L},{4L,0xEEE97BECL,0xE1F44506L},{(-5L),0xC659668AL,0L},{(-1L),0x63F4CD2EL,0xBB8ED630L},{0x7F0FCA53L,0x6D1F2783L,2L},{0xBB8ED630L,(-1L),0x4EAB465CL},{(-7L),(-7L),0x6D1F2783L},{4L,(-2L),6L}}};
+ uint8_t l_959 = 0xE4L;
+ const uint16_t *l_1006[2];
+ const uint16_t * const *l_1005 = &l_1006[1];
+ union U2 l_1009 = {0x4A992D0AL};
+ int16_t *l_1022 = &g_181.f4;
+ const int16_t l_1023 = 0L;
+ const uint8_t l_1024 = 0x99L;
+ int8_t l_1025 = 0x25L;
+ const int32_t l_1026[2][7][1] = {{{0x218A56C6L},{0L},{0x218A56C6L},{0L},{0x218A56C6L},{0L},{0x218A56C6L}},{{0L},{0x218A56C6L},{0L},{0x218A56C6L},{0L},{0x218A56C6L},{0L}}};
+ uint8_t l_1035 = 3UL;
+ int8_t l_1120 = (-1L);
+ union U2 l_1121 = {0x9CB199ABL};
+ int16_t l_1125[3];
+ uint8_t l_1133 = 0xB6L;
+ uint16_t l_1172 = 65535UL;
+ uint16_t **l_1215 = &g_593;
+ uint32_t l_1276 = 4UL;
+ int16_t l_1302 = 0x0B16L;
+ uint16_t l_1332 = 0x101DL;
+ uint32_t * const *l_1364 = &g_1326;
+ uint32_t l_1392 = 4294967295UL;
+ uint32_t l_1397 = 0x52BECEE6L;
+ uint8_t l_1433 = 0x91L;
+ int i, j, k;
+ for (i = 0; i < 7; i++)
+ l_687[i] = &g_390;
+ for (i = 0; i < 2; i++)
+ l_1006[i] = &l_770.f2;
+ for (i = 0; i < 3; i++)
+ l_1125[i] = (-9L);
+ return (*g_201);
+}
+
+
+/* ------------------------------------------ */
+/*
+ * reads : g_75 g_181.f4 g_78 g_102 g_11 g_76 g_231 g_582 g_209 g_586 g_575 g_592 g_593 g_537 g_83 g_82 g_468 g_66 g_202.f1 g_71 g_77 g_16 g_261 g_202 g_649.f0 g_183 g_181 g_9 g_574 g_666 g_668 g_547
+ * writes: g_75 g_181.f4 g_102 g_135 g_11 g_574 g_586 g_231 g_468 g_83 g_390 g_16 g_66 g_71 g_78 g_547 g_77 g_209 g_648
+ */
+static const int32_t * func_29(int32_t ** p_30, int32_t * p_31, int32_t * p_32, uint32_t p_33)
+{ /* block id: 356 */
+ int32_t l_563[3];
+ union U2 ***l_623[10][4][1];
+ const union U1 *l_647 = &g_202;
+ int32_t l_660 = 0x63F79464L;
+ union U0 l_661 = {1UL};
+ int32_t **l_667 = (void*)0;
+ int i, j, k;
+ for (i = 0; i < 3; i++)
+ l_563[i] = 0xBA602EADL;
+ for (i = 0; i < 10; i++)
+ {
+ for (j = 0; j < 4; j++)
+ {
+ for (k = 0; k < 1; k++)
+ l_623[i][j][k] = (void*)0;
+ }
+ }
+ for (g_75 = (-22); (g_75 >= (-9)); g_75 = safe_add_func_int8_t_s_s(g_75, 8))
+ { /* block id: 359 */
+ uint32_t l_584 = 1UL;
+ uint8_t l_607 = 0xA7L;
+ uint16_t l_610 = 0x2FA4L;
+ int32_t **l_637 = &g_83[6][8];
+ const int32_t **l_638 = &g_16;
+ uint16_t *l_644 = &g_135;
+ union U1 *l_650 = &g_202;
+ union U2 l_651 = {4L};
+ for (g_181.f4 = 6; (g_181.f4 >= 2); g_181.f4 -= 1)
+ { /* block id: 362 */
+ union U2 *l_567 = &g_9[0];
+ int32_t * const *l_581[1];
+ int16_t l_585 = 0x9959L;
+ const int32_t **l_599 = &g_16;
+ union U1 l_633 = {0L};
+ int i, j;
+ for (i = 0; i < 1; i++)
+ l_581[i] = &g_83[0][9];
+ if (g_78[g_181.f4][g_181.f4])
+ { /* block id: 363 */
+ const int32_t *l_561[5];
+ union U2 l_583 = {0x0E2EE145L};
+ int i;
+ for (i = 0; i < 5; i++)
+ l_561[i] = &g_11;
+ for (g_102 = 0; (g_102 <= 6); g_102 += 1)
+ { /* block id: 366 */
+ const int32_t **l_562[7][9][2] = {{{(void*)0,(void*)0},{&l_561[2],&l_561[2]},{&l_561[2],&l_561[4]},{&l_561[0],&l_561[2]},{&l_561[2],&l_561[0]},{(void*)0,&l_561[2]},{&l_561[2],&l_561[4]},{&l_561[0],(void*)0},{(void*)0,&l_561[0]}},{{&l_561[2],&l_561[2]},{&l_561[2],(void*)0},{&l_561[2],&l_561[2]},{&l_561[2],(void*)0},{&l_561[2],&l_561[2]},{&l_561[2],(void*)0},{&l_561[0],(void*)0},{&l_561[2],&l_561[4]},{&l_561[2],&l_561[2]}},{{&l_561[0],&l_561[4]},{&l_561[2],&l_561[2]},{(void*)0,&l_561[4]},{&l_561[2],&l_561[2]},{&l_561[0],(void*)0},{&l_561[0],&l_561[2]},{&l_561[2],&l_561[0]},{&l_561[2],(void*)0},{&l_561[2],&l_561[0]}},{{&l_561[2],(void*)0},{&l_561[2],&l_561[4]},{&l_561[2],(void*)0},{&l_561[0],(void*)0},{&l_561[2],&l_561[2]},{&l_561[2],&l_561[4]},{(void*)0,&l_561[2]},{&l_561[2],&l_561[0]},{&l_561[0],&l_561[2]}},{{&l_561[2],&l_561[4]},{(void*)0,(void*)0},{&l_561[0],&l_561[0]},{&l_561[2],&l_561[2]},{&l_561[2],(void*)0},{&l_561[2],&l_561[2]},{&l_561[2],(void*)0},{&l_561[2],&l_561[2]},{&l_561[2],(void*)0}},{{(void*)0,(void*)0},{&l_561[2],&l_561[0]},{&l_561[2],&l_561[2]},{(void*)0,&l_561[4]},{(void*)0,&l_561[2]},{&l_561[0],&l_561[4]},{&l_561[2],&l_561[2]},{(void*)0,(void*)0},{(void*)0,&l_561[2]}},{{&l_561[2],&l_561[0]},{&l_561[2],(void*)0},{&l_561[2],(void*)0},{&l_561[2],(void*)0},{&l_561[2],&l_561[4]},{&l_561[2],(void*)0},{(void*)0,(void*)0},{&l_561[2],&l_561[2]},{&l_561[2],&l_561[4]}}};
+ int i, j, k;
+ l_561[2] = (g_78[g_102][(g_181.f4 + 2)] , l_561[2]);
+ }
+ for (g_135 = 0; (g_135 <= 6); g_135 += 1)
+ { /* block id: 385 */
+ uint16_t *l_578[9] = {(void*)0,(void*)0,(void*)0,(void*)0,(void*)0,(void*)0,(void*)0,(void*)0,(void*)0};
+ uint16_t **l_591 = &l_578[5];
+ int i;
+ if (l_563[1])
+ break;
+ if (((**p_30) = (**p_30)))
+ { /* block id: 388 */
+ const uint32_t *l_570 = (void*)0;
+ const uint32_t *l_572 = &g_573;
+ const uint32_t **l_571[7][6] = {{&l_572,&l_572,&l_572,&l_572,&l_572,&l_572},{&l_572,&l_572,&l_572,&l_572,&l_572,&l_572},{&l_572,&l_572,&l_572,&l_572,&l_572,&l_572},{&l_572,&l_572,&l_572,&l_572,&l_572,&l_572},{&l_572,&l_572,&l_572,&l_572,&l_572,&l_572},{&l_572,&l_572,&l_572,&l_572,&l_572,&l_572},{&l_572,&l_572,&l_572,&l_572,&l_572,&l_572}};
+ union U0 ****l_588 = &g_586;
+ uint8_t *l_594 = &l_583.f1;
+ union U2 l_595 = {0L};
+ int i, j;
+ l_584 = (((safe_rshift_func_uint16_t_u_s((((p_32 == (g_574 = (l_570 = &g_547))) ^ ((**p_30) = (0UL & (safe_div_func_int8_t_s_s(g_76[3], g_231))))) > g_78[g_181.f4][g_181.f4]), 1)) & (l_578[6] != (func_45((safe_mul_func_uint16_t_u_u((((l_581[0] == &p_31) >= 0x707B488DL) <= g_76[3]), p_33)), g_582, l_583, &g_83[0][9], p_33) , &g_135))) && p_33);
+ (**p_30) &= (((g_209 , 65535UL) || l_585) && (func_45((((*l_588) = g_586) == &g_587), ((*g_593) &= (((&g_82 != &p_30) ^ (l_563[0] = ((*l_594) = (safe_mul_func_int8_t_s_s(g_575, (l_591 == g_592)))))) <= 0x9676L)), l_595, &g_83[0][9], l_584) && l_563[2]));
+ return (*g_537);
+ }
+ else
+ { /* block id: 399 */
+ if (l_563[0])
+ break;
+ }
+ if ((**p_30))
+ { /* block id: 402 */
+ return (*g_82);
+ }
+ else
+ { /* block id: 404 */
+ (*p_32) = ((**p_30) &= 0L);
+ }
+ }
+ return (*p_30);
+ }
+ else
+ { /* block id: 410 */
+ uint32_t l_601 = 4294967293UL;
+ int16_t l_606 = 0x86ADL;
+ uint32_t *l_618 = &g_547;
+ int16_t *l_619 = &g_77;
+ union U2 * const **l_622 = (void*)0;
+ union U2 ****l_624[6][1];
+ int32_t l_625 = 7L;
+ int i, j;
+ for (i = 0; i < 6; i++)
+ {
+ for (j = 0; j < 1; j++)
+ l_624[i][j] = &l_623[6][0][0];
+ }
+ (*g_537) = (*g_537);
+ for (g_390 = 0; (g_390 <= 6); g_390 += 1)
+ { /* block id: 414 */
+ const union U0 *l_596[8] = {&g_181,&g_181,&g_181,&g_181,&g_181,&g_181,&g_181,&g_181};
+ const union U0 **l_597 = &l_596[7];
+ union U1 l_598 = {0xBA0F4ADFL};
+ int32_t l_600 = (-8L);
+ const uint16_t l_604 = 0x3537L;
+ int i;
+ (*l_597) = l_596[7];
+ if (func_55(((*p_32) && 0xDACB73B6L), l_598, func_61((+(l_563[2] & p_33)), l_599), g_202.f1))
+ { /* block id: 416 */
+ uint8_t l_605 = 0x27L;
+ l_601--;
+ if (l_601)
+ break;
+ l_605 = l_604;
+ }
+ else
+ { /* block id: 420 */
+ if (l_606)
+ break;
+ if (l_607)
+ break;
+ (*p_32) = (0x66L || 251UL);
+ (**p_30) ^= (g_77 & l_584);
+ }
+ (**p_30) ^= l_563[0];
+ (**p_30) ^= (*p_32);
+ }
+ (**p_30) = ((safe_div_func_uint8_t_u_u(l_610, (safe_div_func_int16_t_s_s((g_209 = (safe_unary_minus_func_uint8_t_u(((safe_mod_func_int16_t_s_s(((*l_619) = (((*l_618) = (safe_add_func_uint32_t_u_u(p_33, l_606))) & (l_610 >= 254UL))), 0xFB78L)) == (*p_32))))), (safe_mul_func_int16_t_s_s((((l_622 == (l_623[2][1][0] = l_623[6][0][0])) <= 5L) , (-7L)), 0x2D99L)))))) < 0x64L);
+ for (g_547 = 0; (g_547 <= 6); g_547 += 1)
+ { /* block id: 436 */
+ union U1 l_634 = {0x8542DBDAL};
+ union U2 l_636 = {1L};
+ uint32_t l_639 = 0x3777B03DL;
+ for (g_71 = 0; (g_71 <= 6); g_71 += 1)
+ { /* block id: 439 */
+ l_625 = (**p_30);
+ }
+ for (g_77 = 0; (g_77 <= 6); g_77 += 1)
+ { /* block id: 444 */
+ union U2 l_626 = {0x7E9C8075L};
+ int32_t *l_635 = &g_102;
+ }
+ return (*g_82);
+ }
+ }
+ }
+ (*l_638) = func_2(((safe_mul_func_int16_t_s_s(g_231, ((((((**l_638) , (**p_30)) <= (((*l_644) = p_33) > (safe_div_func_uint32_t_u_u(func_55(g_78[6][6], (*g_261), (*l_637), ((((g_648 = l_647) == l_650) & g_582) && 1L)), (**p_30))))) >= 0x11L) != 0x1AC1L) | 4294967290UL))) , g_649.f0), l_651, (*g_82), (*g_183), (*l_650));
+ }
+ (**p_30) |= (func_45(((+((safe_mod_func_uint8_t_u_u(l_563[0], (safe_mul_func_int8_t_s_s((safe_add_func_int16_t_s_s((-2L), func_45((safe_mul_func_int16_t_s_s((l_660 = l_563[2]), p_33)), (*g_593), ((l_661 , (safe_add_func_uint16_t_u_u(0UL, (safe_lshift_func_uint8_t_u_u(p_33, 5))))) , (((p_33 ^ 0xBAEAL) & g_202.f1) , g_9[2])), &g_83[0][9], (*g_574)))), l_563[2])))) != 7UL)) & g_666), (**g_592), g_9[0], l_667, p_33) <= g_668);
+ return (*p_30);
+}
+
+
+/* ------------------------------------------ */
+/*
+ * reads : g_181.f4 g_209 g_202.f0 g_11 g_181.f2 g_144 g_83 g_201 g_202 g_537
+ * writes: g_181.f4 g_144 g_547 g_390 g_135 g_66 g_16 g_83
+ */
+static int32_t * func_36(int32_t ** p_37)
+{ /* block id: 342 */
+ int16_t *l_541[5] = {&g_77,&g_77,&g_77,&g_77,&g_77};
+ int32_t l_542 = 1L;
+ int32_t l_543 = 1L;
+ int32_t *l_544 = &g_144;
+ union U0 l_545 = {0x4F299A70L};
+ uint32_t *l_546 = &g_547;
+ int8_t *l_548 = &g_390;
+ uint16_t *l_549 = &g_135;
+ uint32_t l_550 = 1UL;
+ union U2 l_551[10][4] = {{{-1L},{-1L},{0x1487E6D1L},{0x1487E6D1L}},{{0x008F65D1L},{-1L},{0x1487E6D1L},{-1L}},{{-1L},{1L},{-1L},{7L}},{{0x9D8FA7ECL},{1L},{0x9D8FA7ECL},{-1L}},{{-1L},{0x008F65D1L},{-1L},{0x9D8FA7ECL}},{{-1L},{7L},{-1L},{-1L}},{{-1L},{0x008F65D1L},{-1L},{0x008F65D1L}},{{-1L},{1L},{0x008F65D1L},{0x1487E6D1L}},{{0x1487E6D1L},{0x1487E6D1L},{-1L},{-1L}},{{0x9D8FA7ECL},{-1L},{-1L},{-1L}}};
+ int32_t *l_552[5][10] = {{&g_144,&l_543,&l_543,&l_542,&l_543,&l_543,&g_11,&l_545.f3,&l_542,&l_542},{&l_542,&l_545.f3,&l_543,&l_545.f3,&l_545.f3,&g_144,&l_545.f3,&g_468,&l_543,&l_542},{&g_468,&l_542,&g_144,&l_545.f3,&l_543,&g_468,&l_545.f3,&g_11,&l_545.f3,&g_468},{&l_542,&l_545.f3,&l_545.f3,&l_545.f3,&l_542,&l_545.f3,&g_11,&l_545.f3,&l_543,&g_144},{&l_542,&l_543,&g_468,&l_545.f3,&g_11,&g_468,&g_468,&l_545.f3,&g_144,&g_11}};
+ uint32_t l_553 = 8UL;
+ uint8_t *l_554 = &g_66[0];
+ uint16_t l_557[3];
+ int i, j;
+ for (i = 0; i < 3; i++)
+ l_557[i] = 3UL;
+ (*l_544) = (((func_45(((safe_mod_func_int16_t_s_s((l_542 &= (g_181.f4 &= 0x1366L)), l_543)) & (l_543 | (((*l_544) = 0x6B1D3010L) == ((l_545 , 0xF9L) < (((*l_546) = l_543) >= ((65535UL >= ((*l_549) = (((*l_548) = g_209) || g_202.f0))) ^ l_550)))))), g_11, l_551[7][0], p_37, l_545.f3) || g_181.f2) == l_545.f0) == g_11);
+ l_553 ^= (*l_544);
+ if (g_144)
+ goto lbl_558;
+lbl_558:
+ g_16 = func_2(((*l_554) = (*l_544)), l_551[8][3], (*p_37), (((safe_lshift_func_uint16_t_u_u((((&g_181 == (l_545 , &g_181)) == (*l_544)) <= 65526UL), 3)) ^ ((!((*l_544) | l_557[1])) <= (*l_544))) , l_545), (*g_201));
+ (*g_537) = (*p_37);
+ return (*g_537);
+}
+
+
+/* ------------------------------------------ */
+/*
+ * reads : g_11 g_77 g_16 g_71 g_82
+ * writes:
+ */
+static int32_t ** func_38(int16_t p_39, int8_t p_40, union U2 p_41, union U0 p_42)
+{ /* block id: 19 */
+ union U2 l_87 = {-6L};
+ int16_t l_92 = 0x69BAL;
+ int32_t *l_101[5][9][5] = {{{&g_102,&g_11,&g_11,&g_11,(void*)0},{(void*)0,&g_102,(void*)0,&g_102,&g_102},{(void*)0,(void*)0,&g_102,&g_11,&g_11},{&g_11,&g_11,(void*)0,&g_11,&g_11},{&g_102,&g_11,&g_102,&g_11,&g_102},{&g_102,&g_11,&g_102,&g_11,(void*)0},{&g_11,&g_102,(void*)0,&g_11,&g_102},{&g_102,&g_102,&g_102,(void*)0,&g_11},{&g_102,&g_102,&g_11,&g_11,(void*)0}},{{&g_102,(void*)0,&g_11,&g_11,(void*)0},{&g_102,&g_102,&g_102,&g_11,&g_11},{&g_11,&g_11,&g_11,&g_11,&g_102},{&g_11,&g_102,&g_11,&g_11,&g_102},{&g_102,&g_11,&g_102,&g_102,&g_102},{(void*)0,&g_102,&g_102,&g_11,&g_11},{&g_11,&g_102,&g_102,(void*)0,&g_11},{&g_11,&g_102,(void*)0,(void*)0,&g_11},{(void*)0,&g_102,&g_102,&g_11,&g_11}},{{&g_102,&g_11,&g_102,&g_11,&g_11},{&g_102,&g_102,&g_102,&g_102,&g_11},{&g_102,&g_102,&g_11,&g_102,&g_102},{&g_11,(void*)0,&g_102,&g_102,&g_102},{&g_11,&g_11,&g_11,&g_102,&g_102},{&g_102,&g_11,&g_102,&g_102,&g_11},{&g_102,&g_102,&g_102,&g_102,(void*)0},{&g_102,(void*)0,(void*)0,&g_11,&g_102},{&g_102,&g_102,(void*)0,(void*)0,&g_11}},{{&g_102,(void*)0,&g_11,&g_102,&g_11},{&g_102,&g_102,(void*)0,&g_102,&g_102},{&g_102,(void*)0,(void*)0,&g_11,&g_102},{&g_102,&g_11,&g_11,(void*)0,&g_11},{&g_102,(void*)0,&g_102,&g_11,(void*)0},{&g_11,&g_102,&g_102,&g_102,(void*)0},{&g_11,&g_11,&g_102,&g_102,&g_102},{&g_102,&g_11,&g_11,&g_102,&g_102},{&g_102,&g_102,&g_11,&g_11,&g_102}},{{(void*)0,&g_11,&g_102,(void*)0,&g_102},{(void*)0,&g_11,&g_102,&g_102,&g_102},{&g_102,&g_102,&g_102,&g_102,&g_11},{&g_102,&g_11,&g_102,&g_11,&g_102},{&g_11,&g_11,&g_102,&g_11,&g_102},{&g_11,&g_102,&g_102,&g_11,&g_102},{(void*)0,(void*)0,(void*)0,&g_102,&g_102},{(void*)0,&g_102,(void*)0,&g_11,&g_102},{&g_11,&g_102,&g_102,&g_102,&g_102}}};
+ uint32_t l_103 = 0xBDDE1E78L;
+ int8_t l_114 = 0xFAL;
+ uint32_t l_158 = 7UL;
+ union U0 *l_180 = &g_181;
+ union U1 l_193 = {1L};
+ int32_t *l_196 = &g_102;
+ uint32_t l_212 = 0xCC8533B4L;
+ uint16_t l_263 = 0x3F35L;
+ int32_t **l_294 = (void*)0;
+ int32_t ***l_295 = (void*)0;
+ int32_t ***l_296 = (void*)0;
+ int32_t ***l_297 = &g_82;
+ const int32_t **l_298[9] = {&g_16,&g_16,&g_16,&g_16,&g_16,&g_16,&g_16,&g_16,&g_16};
+ union U2 **l_324 = &g_282;
+ union U2 **l_325 = &g_282;
+ union U1 l_467 = {0x564CF22EL};
+ uint32_t l_497 = 0xAD274BE0L;
+ int32_t l_502[2];
+ int16_t l_536 = 7L;
+ int i, j, k;
+ for (i = 0; i < 2; i++)
+ l_502[i] = 1L;
+ l_103 |= ((((l_87 , p_42) , p_42) , ((g_11 != g_11) != (safe_lshift_func_uint16_t_u_s((g_77 , (safe_mul_func_int8_t_s_s((l_92 < l_92), (safe_mul_func_uint16_t_u_u((safe_lshift_func_uint8_t_u_u(((safe_div_func_int32_t_s_s((safe_div_func_int16_t_s_s((((p_41.f0 = p_42.f4) | (*g_16)) == 0xF910L), g_71)), 0xBA0E3889L)) | 0UL), l_92)), l_92))))), 9)))) ^ 0x556CL);
+ return (*l_297);
+}
+
+
+/* ------------------------------------------ */
+/*
+ * reads :
+ * writes:
+ */
+static int8_t func_45(uint8_t p_46, uint16_t p_47, union U2 p_48, int32_t ** p_49, const uint32_t p_50)
+{ /* block id: 16 */
+ return p_50;
+}
+
+
+/* ------------------------------------------ */
+/*
+ * reads : g_71 g_78
+ * writes: g_71 g_78
+ */
+static int8_t func_55(uint8_t p_56, union U1 p_57, int32_t * p_58, uint8_t p_59)
+{ /* block id: 12 */
+ int16_t l_69 = 1L;
+ int32_t *l_70[8] = {&g_11,&g_11,&g_11,&g_11,&g_11,&g_11,&g_11,&g_11};
+ int8_t l_74[4][7] = {{4L,4L,4L,4L,4L,4L,4L},{5L,(-5L),5L,(-5L),5L,(-5L),5L},{4L,4L,4L,4L,4L,4L,4L},{5L,(-5L),5L,(-5L),5L,(-5L),5L}};
+ int32_t l_81 = 1L;
+ int i, j;
+ g_71++;
+ ++g_78[2][2];
+ return l_81;
+}
+
+
+/* ------------------------------------------ */
+/*
+ * reads : g_66
+ * writes: g_16 g_66
+ */
+static int32_t * func_61(int16_t p_62, const int32_t ** p_63)
+{ /* block id: 8 */
+ int32_t *l_64 = &g_11;
+ int32_t *l_65[1];
+ int i;
+ for (i = 0; i < 1; i++)
+ l_65[i] = &g_11;
+ (*p_63) = l_64;
+ ++g_66[0];
+ return l_64;
+}
+
+
+
+
+/* ---------------------------------------- */
+int main (int argc, char* argv[])
+{
+ int i, j;
+ int print_hash_value = 0;
+ if (argc == 2 && strcmp(argv[1], "1") == 0) print_hash_value = 1;
+ platform_main_begin();
+ crc32_gentab();
+ func_1();
+ for (i = 0; i < 5; i++)
+ {
+ transparent_crc(g_9[i].f0, "g_9[i].f0", print_hash_value);
+ if (print_hash_value) printf("index = [%d]\n", i);
+
+ }
+ transparent_crc(g_11, "g_11", print_hash_value);
+ for (i = 0; i < 1; i++)
+ {
+ transparent_crc(g_66[i], "g_66[i]", print_hash_value);
+ if (print_hash_value) printf("index = [%d]\n", i);
+
+ }
+ transparent_crc(g_71, "g_71", print_hash_value);
+ transparent_crc(g_75, "g_75", print_hash_value);
+ for (i = 0; i < 5; i++)
+ {
+ transparent_crc(g_76[i], "g_76[i]", print_hash_value);
+ if (print_hash_value) printf("index = [%d]\n", i);
+
+ }
+ transparent_crc(g_77, "g_77", print_hash_value);
+ for (i = 0; i < 7; i++)
+ {
+ for (j = 0; j < 9; j++)
+ {
+ transparent_crc(g_78[i][j], "g_78[i][j]", print_hash_value);
+ if (print_hash_value) printf("index = [%d][%d]\n", i, j);
+
+ }
+ }
+ transparent_crc(g_102, "g_102", print_hash_value);
+ transparent_crc(g_135, "g_135", print_hash_value);
+ transparent_crc(g_144, "g_144", print_hash_value);
+ transparent_crc(g_160, "g_160", print_hash_value);
+ transparent_crc(g_181.f2, "g_181.f2", print_hash_value);
+ transparent_crc(g_181.f4, "g_181.f4", print_hash_value);
+ transparent_crc(g_202.f0, "g_202.f0", print_hash_value);
+ transparent_crc(g_202.f1, "g_202.f1", print_hash_value);
+ transparent_crc(g_209, "g_209", print_hash_value);
+ transparent_crc(g_211, "g_211", print_hash_value);
+ transparent_crc(g_231, "g_231", print_hash_value);
+ transparent_crc(g_328, "g_328", print_hash_value);
+ transparent_crc(g_390, "g_390", print_hash_value);
+ transparent_crc(g_468, "g_468", print_hash_value);
+ transparent_crc(g_547, "g_547", print_hash_value);
+ transparent_crc(g_573, "g_573", print_hash_value);
+ transparent_crc(g_575, "g_575", print_hash_value);
+ transparent_crc(g_582, "g_582", print_hash_value);
+ transparent_crc(g_649.f0, "g_649.f0", print_hash_value);
+ transparent_crc(g_649.f1, "g_649.f1", print_hash_value);
+ transparent_crc(g_666, "g_666", print_hash_value);
+ transparent_crc(g_668, "g_668", print_hash_value);
+ transparent_crc(g_756, "g_756", print_hash_value);
+ transparent_crc(g_860, "g_860", print_hash_value);
+ transparent_crc(g_894, "g_894", print_hash_value);
+ transparent_crc(g_947, "g_947", print_hash_value);
+ for (i = 0; i < 5; i++)
+ {
+ for (j = 0; j < 3; j++)
+ {
+ transparent_crc(g_966[i][j], "g_966[i][j]", print_hash_value);
+ if (print_hash_value) printf("index = [%d][%d]\n", i, j);
+
+ }
+ }
+ for (i = 0; i < 9; i++)
+ {
+ for (j = 0; j < 9; j++)
+ {
+ transparent_crc(g_1059[i][j].f0, "g_1059[i][j].f0", print_hash_value);
+ transparent_crc(g_1059[i][j].f1, "g_1059[i][j].f1", print_hash_value);
+ if (print_hash_value) printf("index = [%d][%d]\n", i, j);
+
+ }
+ }
+ transparent_crc(g_1124, "g_1124", print_hash_value);
+ transparent_crc(g_1254, "g_1254", print_hash_value);
+ transparent_crc(g_1294, "g_1294", print_hash_value);
+ transparent_crc(g_1418, "g_1418", print_hash_value);
+ transparent_crc(g_1501, "g_1501", print_hash_value);
+ transparent_crc(g_1597, "g_1597", print_hash_value);
+ transparent_crc(g_1613, "g_1613", print_hash_value);
+ for (i = 0; i < 1; i++)
+ {
+ transparent_crc(g_1665[i], "g_1665[i]", print_hash_value);
+ if (print_hash_value) printf("index = [%d]\n", i);
+
+ }
+ platform_main_end(crc32_context ^ 0xFFFFFFFFUL, print_hash_value);
+ return 0;
+}
+
+/************************ statistics *************************
+XXX max struct depth: 0
+breakdown:
+ depth: 0, occurrence: 592
+XXX total union variables: 93
+
+XXX non-zero bitfields defined in structs: 1
+XXX zero bitfields defined in structs: 0
+XXX const bitfields defined in structs: 0
+XXX volatile bitfields defined in structs: 0
+XXX structs with bitfields in the program: 68
+breakdown:
+ indirect level: 0, occurrence: 51
+ indirect level: 1, occurrence: 5
+ indirect level: 2, occurrence: 5
+ indirect level: 3, occurrence: 5
+ indirect level: 4, occurrence: 2
+XXX full-bitfields structs in the program: 0
+breakdown:
+XXX times a bitfields struct's address is taken: 23
+XXX times a bitfields struct on LHS: 4
+XXX times a bitfields struct on RHS: 99
+XXX times a single bitfield on LHS: 18
+XXX times a single bitfield on RHS: 43
+
+XXX max expression depth: 41
+breakdown:
+ depth: 1, occurrence: 83
+ depth: 2, occurrence: 20
+ depth: 6, occurrence: 1
+ depth: 7, occurrence: 2
+ depth: 9, occurrence: 1
+ depth: 16, occurrence: 1
+ depth: 17, occurrence: 1
+ depth: 19, occurrence: 1
+ depth: 20, occurrence: 1
+ depth: 23, occurrence: 1
+ depth: 24, occurrence: 1
+ depth: 25, occurrence: 1
+ depth: 26, occurrence: 1
+ depth: 35, occurrence: 1
+ depth: 41, occurrence: 1
+
+XXX total number of pointers: 403
+
+XXX times a variable address is taken: 932
+XXX times a pointer is dereferenced on RHS: 354
+breakdown:
+ depth: 1, occurrence: 286
+ depth: 2, occurrence: 54
+ depth: 3, occurrence: 10
+ depth: 4, occurrence: 4
+XXX times a pointer is dereferenced on LHS: 297
+breakdown:
+ depth: 1, occurrence: 272
+ depth: 2, occurrence: 21
+ depth: 3, occurrence: 4
+XXX times a pointer is compared with null: 26
+XXX times a pointer is compared with address of another variable: 7
+XXX times a pointer is compared with another pointer: 10
+XXX times a pointer is qualified to be dereferenced: 6446
+
+XXX max dereference level: 4
+breakdown:
+ level: 0, occurrence: 0
+ level: 1, occurrence: 1057
+ level: 2, occurrence: 375
+ level: 3, occurrence: 48
+ level: 4, occurrence: 15
+XXX number of pointers point to pointers: 164
+XXX number of pointers point to scalars: 201
+XXX number of pointers point to structs: 0
+XXX percent of pointers has null in alias set: 31
+XXX average alias set size: 1.41
+
+XXX times a non-volatile is read: 2062
+XXX times a non-volatile is write: 900
+XXX times a volatile is read: 0
+XXX times read thru a pointer: 0
+XXX times a volatile is write: 0
+XXX times written thru a pointer: 0
+XXX times a volatile is available for access: 0
+XXX percentage of non-volatile access: 100
+
+XXX forward jumps: 1
+XXX backward jumps: 12
+
+XXX stmts: 80
+XXX max block depth: 5
+breakdown:
+ depth: 0, occurrence: 27
+ depth: 1, occurrence: 4
+ depth: 2, occurrence: 7
+ depth: 3, occurrence: 14
+ depth: 4, occurrence: 14
+ depth: 5, occurrence: 14
+
+XXX percentage a fresh-made variable is used: 18.2
+XXX percentage an existing variable is used: 81.8
+FYI: the random generator makes assumptions about the integer size. See platform.info for more details.
+********************* end of statistics **********************/
+
diff --git a/tests/fuzz/7.c.txt b/tests/fuzz/7.c.txt
new file mode 100644
index 00000000..9d4c7690
--- /dev/null
+++ b/tests/fuzz/7.c.txt
@@ -0,0 +1 @@
+checksum = 40E796EF
diff --git a/tests/fuzz/creduce_tester.py b/tests/fuzz/creduce_tester.py
new file mode 100755
index 00000000..c3460e9d
--- /dev/null
+++ b/tests/fuzz/creduce_tester.py
@@ -0,0 +1,53 @@
+#!/usr/bin/python
+
+'''
+Runs csmith, a C fuzzer, and looks for bugs
+'''
+
+import os, sys, difflib
+from subprocess import Popen, PIPE, STDOUT
+
+sys.path += [os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), 'tools')]
+import shared
+
+filename = sys.argv[1]
+print 'testing file', filename
+
+print '2) Compile natively'
+shared.try_delete(filename)
+shared.execute([shared.CLANG_CC, '-O2', filename + '.c', '-o', filename] + CSMITH_CFLAGS, stderr=PIPE)
+assert os.path.exists(filename)
+print '3) Run natively'
+try:
+ correct = shared.timeout_run(Popen([filename], stdout=PIPE, stderr=PIPE), 3)
+except Exception, e:
+ print 'Failed or infinite looping in native, skipping', e
+ notes['invalid'] += 1
+ os.exit(0) # boring
+
+print '4) Compile JS-ly and compare'
+
+def try_js(args):
+ shared.try_delete(filename + '.js')
+ shared.execute([shared.EMCC, '-O2', '-s', 'ASM_JS=1', '-s', 'PRECISE_I64_MATH=1', '-s', 'PRECISE_I32_MUL=1', filename + '.c', '-o', filename + '.js'] + CSMITH_CFLAGS + args, stderr=PIPE)
+ assert os.path.exists(filename + '.js')
+ js = shared.run_js(filename + '.js', stderr=PIPE, engine=engine1)
+ assert correct == js, ''.join([a.rstrip()+'\n' for a in difflib.unified_diff(correct.split('\n'), js.split('\n'), fromfile='expected', tofile='actual')])
+
+# Try normally, then try unaligned because csmith does generate nonportable code that requires x86 alignment
+ok = False
+normal = True
+for args, note in [([], None), (['-s', 'UNALIGNED_MEMORY=1'], 'unaligned')]:
+ try:
+ try_js(args)
+ ok = True
+ if note:
+ notes[note] += 1
+ break
+ except Exception, e:
+ print e
+ normal = False
+if not ok: sys.exit(1)
+
+sys.exit(0) # boring
+
diff --git a/tests/fuzz/csmith.h b/tests/fuzz/csmith.h
new file mode 100644
index 00000000..f1334a37
--- /dev/null
+++ b/tests/fuzz/csmith.h
@@ -0,0 +1,130 @@
+/* -*- mode: C -*-
+ *
+ * Copyright (c) 2007-2010 The University of Utah
+ * All rights reserved.
+ *
+ * This file is part of `csmith', a random generator of C programs.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef RANDOM_RUNTIME_H
+#define RANDOM_RUNTIME_H
+
+#ifdef CSMITH_MINIMAL
+#include "csmith_minimal.h"
+#else
+
+/*****************************************************************************/
+
+#include <string.h>
+
+#define __STDC_LIMIT_MACROS
+#include "random_inc.h"
+
+static uint32_t crc32_tab[256];
+static uint32_t crc32_context = 0xFFFFFFFFUL;
+
+static void
+crc32_gentab (void)
+{
+ uint32_t crc;
+ const uint32_t poly = 0xEDB88320UL;
+ int i, j;
+
+ for (i = 0; i < 256; i++) {
+ crc = i;
+ for (j = 8; j > 0; j--) {
+ if (crc & 1) {
+ crc = (crc >> 1) ^ poly;
+ } else {
+ crc >>= 1;
+ }
+ }
+ crc32_tab[i] = crc;
+ }
+}
+
+static void
+crc32_byte (uint8_t b) {
+ crc32_context =
+ ((crc32_context >> 8) & 0x00FFFFFF) ^
+ crc32_tab[(crc32_context ^ b) & 0xFF];
+}
+
+#if defined(__SPLAT__) || defined (__COMPCERT__) || defined(NO_LONGLONG)
+static void
+crc32_8bytes (uint32_t val)
+{
+ crc32_byte ((val>>0) & 0xff);
+ crc32_byte ((val>>8) & 0xff);
+ crc32_byte ((val>>16) & 0xff);
+ crc32_byte ((val>>24) & 0xff);
+}
+
+static void
+transparent_crc (uint32_t val, char* vname, int flag)
+{
+ crc32_8bytes(val);
+ if (flag) {
+ printf("...checksum after hashing %s : %X\n", vname, crc32_context ^ 0xFFFFFFFFU);
+ }
+}
+#else
+static void
+crc32_8bytes (uint64_t val)
+{
+ crc32_byte ((val>>0) & 0xff);
+ crc32_byte ((val>>8) & 0xff);
+ crc32_byte ((val>>16) & 0xff);
+ crc32_byte ((val>>24) & 0xff);
+ crc32_byte ((val>>32) & 0xff);
+ crc32_byte ((val>>40) & 0xff);
+ crc32_byte ((val>>48) & 0xff);
+ crc32_byte ((val>>56) & 0xff);
+}
+
+static void
+transparent_crc (uint64_t val, char* vname, int flag)
+{
+ crc32_8bytes(val);
+ if (flag) {
+ printf("...checksum after hashing %s : %lX\n", vname, crc32_context ^ 0xFFFFFFFFUL);
+ }
+}
+#endif
+
+/*****************************************************************************/
+
+#endif
+
+#endif /* RANDOM_RUNTIME_H */
+
+/*
+ * Local Variables:
+ * c-basic-offset: 4
+ * tab-width: 4
+ * End:
+ */
+
+/* End of file. */
diff --git a/tests/fuzz/csmith_driver.py b/tests/fuzz/csmith_driver.py
new file mode 100755
index 00000000..3fa58db6
--- /dev/null
+++ b/tests/fuzz/csmith_driver.py
@@ -0,0 +1,117 @@
+#!/usr/bin/python
+
+'''
+Runs csmith, a C fuzzer, and looks for bugs
+'''
+
+import os, sys, difflib, shutil
+from subprocess import Popen, PIPE, STDOUT
+
+sys.path += [os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), 'tools')]
+import shared
+
+engine1 = eval('shared.' + sys.argv[1]) if len(sys.argv) > 1 else shared.JS_ENGINES[0]
+engine2 = eval('shared.' + sys.argv[2]) if len(sys.argv) > 2 else None
+
+print 'testing js engines', engine1, engine2
+
+CSMITH = os.path.expanduser('~/Dev/csmith/src/csmith')
+CSMITH_CFLAGS = ['-I' + os.path.expanduser('~/Dev/csmith/runtime/')]
+
+filename = os.path.join(shared.CANONICAL_TEMP_DIR, 'fuzzcode')
+
+shared.DEFAULT_TIMEOUT = 1
+
+tried = 0
+
+notes = { 'invalid': 0, 'unaligned': 0, 'embug': 0 }
+
+fails = 0
+
+while 1:
+ print 'Tried %d, notes: %s' % (tried, notes)
+ tried += 1
+ print '1) Generate C'
+ shared.execute([CSMITH, '--no-volatiles', '--no-math64', '--no-packed-struct'],# +
+ #['--max-block-depth', '2', '--max-block-size', '2', '--max-expr-complexity', '2', '--max-funcs', '2'],
+ stdout=open(filename + '.c', 'w'))
+ print '1) Generate C... %.2f K of C source' % (len(open(filename + '.c').read())/1024.)
+
+ print '2) Compile natively'
+ shared.try_delete(filename)
+ shared.execute([shared.CLANG_CC, '-O2', filename + '.c', '-o', filename + '1'] + CSMITH_CFLAGS, stderr=PIPE) # + shared.EMSDK_OPTS
+ shared.execute([shared.CLANG_CC, '-O2', '-emit-llvm', '-c', '-Xclang', '-triple=i386-pc-linux-gnu', filename + '.c', '-o', filename + '.bc'] + CSMITH_CFLAGS + shared.EMSDK_OPTS, stderr=PIPE)
+ shared.execute([shared.path_from_root('tools', 'nativize_llvm.py'), filename + '.bc'], stdout=PIPE, stderr=PIPE)
+ shutil.move(filename + '.bc.run', filename + '2')
+ shared.execute([shared.CLANG_CC, filename + '.c', '-o', filename + '3'] + CSMITH_CFLAGS, stderr=PIPE)
+ print '3) Run natively'
+ try:
+ correct1 = shared.timeout_run(Popen([filename + '1'], stdout=PIPE, stderr=PIPE), 5)
+ if 'Segmentation fault' in correct1 or len(correct1) < 10: raise Exception('segfault')
+ correct2 = shared.timeout_run(Popen([filename + '2'], stdout=PIPE, stderr=PIPE), 5)
+ if 'Segmentation fault' in correct2 or len(correct2) < 10: raise Exception('segfault')
+ correct3 = shared.timeout_run(Popen([filename + '3'], stdout=PIPE, stderr=PIPE), 5)
+ if 'Segmentation fault' in correct3 or len(correct3) < 10: raise Exception('segfault')
+ if correct1 != correct3: raise Exception('clang opts change result')
+ except Exception, e:
+ print 'Failed or infinite looping in native, skipping', e
+ notes['invalid'] += 1
+ continue
+
+ print '4) Compile JS-ly and compare'
+
+ def try_js(args):
+ shared.try_delete(filename + '.js')
+ print '(compile)'
+ shared.execute([shared.EMCC, '-O2', '-s', 'ASM_JS=1', filename + '.c', '-o', filename + '.js'] + CSMITH_CFLAGS + args, stderr=PIPE)
+ assert os.path.exists(filename + '.js')
+ print '(run)'
+ js = shared.run_js(filename + '.js', stderr=PIPE, engine=engine1, check_timeout=True)
+ assert correct1 == js or correct2 == js, ''.join([a.rstrip()+'\n' for a in difflib.unified_diff(correct1.split('\n'), js.split('\n'), fromfile='expected', tofile='actual')])
+
+ # Try normally, then try unaligned because csmith does generate nonportable code that requires x86 alignment
+ ok = False
+ normal = True
+ for args, note in [([], None), (['-s', 'UNALIGNED_MEMORY=1'], 'unaligned')]:
+ try:
+ try_js(args)
+ ok = True
+ if note:
+ notes[note] += 1
+ break
+ except Exception, e:
+ print e
+ normal = False
+ if not ok:
+ print "EMSCRIPTEN BUG"
+ notes['embug'] += 1
+ fails += 1
+ shutil.copyfile('fuzzcode.c', 'newfail%d.c' % fails)
+ continue
+ #if not ok:
+ # try: # finally, try with safe heap. if that is triggered, this is nonportable code almost certainly
+ # try_js(['-s', 'SAFE_HEAP=1'])
+ # except Exception, e:
+ # print e
+ # js = shared.run_js(filename + '.js', stderr=PIPE, full_output=True)
+ # print js
+ # if 'SAFE_HEAP' in js:
+ # notes['safeheap'] += 1
+ # else:
+ # break
+
+ # This is ok. Try in secondary JS engine too
+ if engine2 and normal:
+ try:
+ js2 = shared.run_js(filename + '.js', stderr=PIPE, engine=engine2, full_output=True, check_timeout=True)
+ except:
+ print 'failed to run in secondary', js2
+ break
+
+ # asm.js testing
+ assert 'warning: Successfully compiled asm.js code' in js2, 'must validate'
+ js2 = js2.replace('\nwarning: Successfully compiled asm.js code\n', '')
+
+ assert js2 == correct1 or js2 == correct2, ''.join([a.rstrip()+'\n' for a in difflib.unified_diff(correct1.split('\n'), js2.split('\n'), fromfile='expected', tofile='actual')]) + 'ODIN FAIL'
+ print 'odin ok'
+
diff --git a/tests/fuzz/platform_generic.h b/tests/fuzz/platform_generic.h
new file mode 100644
index 00000000..b2ef33a3
--- /dev/null
+++ b/tests/fuzz/platform_generic.h
@@ -0,0 +1,132 @@
+/* -*- mode: C -*-
+ *
+ *
+ * Copyright (c) 2007, 2008 The University of Utah
+ * All rights reserved.
+ *
+ * This file is part of `csmith', a random generator of C programs.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef PLATFORM_GENERIC_H
+#define PLATFORM_GENERIC_H
+
+/*****************************************************************************/
+
+#ifdef STANDALONE
+extern int printf (const char *, ...);
+#else
+#include <stdio.h>
+#endif
+
+static void
+platform_main_begin(void)
+{
+ /* Nothing to do. */
+}
+
+static void
+platform_main_end(uint32_t crc, int flag)
+{
+#if defined (__FRAMAC)
+ Frama_C_dump_assert_each();
+#endif
+ printf ("checksum = %X\n", crc);
+#if defined (LOG_WRAPPERS)
+ {
+ int i, first;
+
+ printf ("executed wrappers: ");
+ first = 1;
+ for (i=1; i<N_WRAP+1; i++) {
+ if (__executed_checks[i]) {
+ if (!first) {
+ printf (",");
+ } else {
+ first = 0;
+ }
+ printf ("%d", i);
+ }
+ }
+ printf ("\n");
+
+ printf ("dead wrappers: ");
+ first = 1;
+ for (i=1; i<N_WRAP+1; i++) {
+ if (!__executed_checks[i]) {
+ if (!first) {
+ printf (",");
+ } else {
+ first = 0;
+ }
+ printf ("%d", i);
+ }
+ }
+ printf ("\n");
+
+ printf ("wrappers that failed at least once: ");
+ first = 1;
+ for (i=1; i<N_WRAP+1; i++) {
+ if (__failed_checks[i]) {
+ if (!first) {
+ printf (",");
+ } else {
+ first = 0;
+ }
+ printf ("%d", i);
+ }
+ }
+ printf ("\n");
+
+ printf ("wrappers that never failed (or never executed): ");
+ first = 1;
+ for (i=1; i<N_WRAP+1; i++) {
+ if (!__failed_checks[i]) {
+ if (!first) {
+ printf (",");
+ } else {
+ first = 0;
+ }
+ printf ("%d", i);
+ }
+ }
+ printf ("\n");
+ }
+#endif
+}
+
+#define MB (1<<20)
+
+/*****************************************************************************/
+
+#endif /* PLATFORM_GENERIC_H */
+
+/*
+ * Local Variables:
+ * c-basic-offset: 4
+ * tab-width: 4
+ * End:
+ */
+
+/* End of file. */
diff --git a/tests/fuzz/random_inc.h b/tests/fuzz/random_inc.h
new file mode 100644
index 00000000..7559cbd7
--- /dev/null
+++ b/tests/fuzz/random_inc.h
@@ -0,0 +1,129 @@
+/* -*- mode: C -*-
+ *
+ * Copyright (c) 2007-2010 The University of Utah
+ * All rights reserved.
+ *
+ * This file is part of `csmith', a random generator of C programs.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef RANDOM_INC_H
+#define RANDOM_INC_H
+
+
+#if defined(STANDALONE)
+ #if defined(_MSC_VER)
+ #include <limits.h>
+ #include "windows/stdint.h"
+ #elif defined (IA32_ARCH)
+ #include "stdint_ia32.h"
+ #elif defined (IA64_ARCH)
+ #include "stdint_ia64.h"
+ #elif defined (MSP430)
+ #include "stdint_msp430.h"
+ #elif defined (AVR_ARCH)
+ #include "stdint_avr.h"
+ #else
+ #include "stdint_ia32.h"
+ #endif
+#else
+ #include <limits.h>
+ #if defined(_MSC_VER)
+ #include "windows/stdint.h"
+ #else
+ #include <stdint.h>
+ #endif
+#endif
+
+#include <assert.h>
+
+/*****************************************************************************/
+
+#ifndef DEPUTY
+#define COUNT(n)
+#define TC
+#define SAFE
+#endif
+
+/*****************************************************************************/
+
+#ifdef LOG_WRAPPERS
+#include "wrapper.h"
+char __failed_checks[N_WRAP+1];
+char __executed_checks[N_WRAP+1];
+#define UNDEFINED(__val) (__failed_checks[index]=1,(__val))
+#define LOG_INDEX , int index
+#define LOG_EXEC __executed_checks[index]=1;
+#else
+#define UNDEFINED(__val) (__val)
+#define LOG_INDEX
+#define LOG_EXEC
+#endif
+
+#if defined(AVR_ARCH)
+#include "platform_avr.h"
+#elif defined (MSP430)
+#include "platform_msp430.h"
+#else
+#include "platform_generic.h"
+#endif
+
+#define STATIC static
+
+#if defined (USE_MATH_MACROS_NOTMP)
+#include "safe_math_macros_notmp.h"
+#elif defined (USE_MATH_MACROS)
+#include "safe_math_macros.h"
+#else
+#define FUNC_NAME(x) (safe_##x)
+#include "safe_math.h"
+#undef FUNC_NAME
+#endif
+
+#define INT_BIT (sizeof(int)*CHAR_BIT)
+#define _CSMITH_BITFIELD(x) (((x)>INT_BIT)?((x)%INT_BIT):(x))
+
+#ifdef TCC
+
+void* memcpy(void* dest, const void* src, size_t count) {
+ char* dst8 = (char*)dest;
+ char* src8 = (char*)src;
+
+ while (count--) {
+ *dst8++ = *src8++;
+ }
+ return dest;
+}
+
+void *memset(void *s, int c, size_t n)
+{
+ unsigned char* p=s;
+ while(n--)
+ *p++ = (unsigned char)c;
+ return s;
+}
+
+#endif
+
+#endif // RANDOM_INC_H
diff --git a/tests/fuzz/safe_math.h b/tests/fuzz/safe_math.h
new file mode 100644
index 00000000..393ebba1
--- /dev/null
+++ b/tests/fuzz/safe_math.h
@@ -0,0 +1,947 @@
+
+#ifndef SAFE_MATH_H
+#define SAFE_MATH_H
+
+
+
+
+
+
+
+
+
+STATIC int8_t
+FUNC_NAME(unary_minus_func_int8_t_s)(int8_t si LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+#if (INT8_MAX>=INT_MAX)
+ (si==INT8_MIN) ?
+ (UNDEFINED(si)) :
+#endif
+#endif
+ -si;
+}
+
+STATIC int8_t
+FUNC_NAME(add_func_int8_t_s_s)(int8_t si1, int8_t si2 LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+#if (INT8_MAX>=INT_MAX)
+ (((si1>0) && (si2>0) && (si1 > (INT8_MAX-si2))) || ((si1<0) && (si2<0) && (si1 < (INT8_MIN-si2)))) ?
+ (UNDEFINED(si1)) :
+#endif
+#endif
+ (si1 + si2);
+}
+
+STATIC int8_t
+FUNC_NAME(sub_func_int8_t_s_s)(int8_t si1, int8_t si2 LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+#if (INT8_MAX>=INT_MAX)
+ (((si1^si2) & (((si1 ^ ((si1^si2) & (~INT8_MAX)))-si2)^si2)) < 0) ?
+ (UNDEFINED(si1)) :
+#endif
+#endif
+ (si1 - si2);
+}
+
+STATIC int8_t
+FUNC_NAME(mul_func_int8_t_s_s)(int8_t si1, int8_t si2 LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+#if (INT8_MAX>=INT_MAX)
+ (((si1 > 0) && (si2 > 0) && (si1 > (INT8_MAX / si2))) || ((si1 > 0) && (si2 <= 0) && (si2 < (INT8_MIN / si1))) || ((si1 <= 0) && (si2 > 0) && (si1 < (INT8_MIN / si2))) || ((si1 <= 0) && (si2 <= 0) && (si1 != 0) && (si2 < (INT8_MAX / si1)))) ?
+ (UNDEFINED(si1)) :
+#endif
+#endif
+ si1 * si2;
+}
+
+STATIC int8_t
+FUNC_NAME(mod_func_int8_t_s_s)(int8_t si1, int8_t si2 LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ ((si2 == 0) || ((si1 == INT8_MIN) && (si2 == (-1)))) ?
+ (UNDEFINED(si1)) :
+#endif
+ (si1 % si2);
+}
+
+STATIC int8_t
+FUNC_NAME(div_func_int8_t_s_s)(int8_t si1, int8_t si2 LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ ((si2 == 0) || ((si1 == INT8_MIN) && (si2 == (-1)))) ?
+ (UNDEFINED(si1)) :
+#endif
+ (si1 / si2);
+}
+
+STATIC int8_t
+FUNC_NAME(lshift_func_int8_t_s_s)(int8_t left, int right LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ ((left < 0) || (((int)right) < 0) || (((int)right) >= 32) || (left > (INT8_MAX >> ((int)right)))) ?
+ (UNDEFINED(left)) :
+#endif
+ (left << ((int)right));
+}
+
+STATIC int8_t
+FUNC_NAME(lshift_func_int8_t_s_u)(int8_t left, unsigned int right LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ ((left < 0) || (((unsigned int)right) >= 32) || (left > (INT8_MAX >> ((unsigned int)right)))) ?
+ (UNDEFINED(left)) :
+#endif
+ (left << ((unsigned int)right));
+}
+
+STATIC int8_t
+FUNC_NAME(rshift_func_int8_t_s_s)(int8_t left, int right LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ ((left < 0) || (((int)right) < 0) || (((int)right) >= 32))?
+ (UNDEFINED(left)) :
+#endif
+ (left >> ((int)right));
+}
+
+STATIC int8_t
+FUNC_NAME(rshift_func_int8_t_s_u)(int8_t left, unsigned int right LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ ((left < 0) || (((unsigned int)right) >= 32)) ?
+ (UNDEFINED(left)) :
+#endif
+ (left >> ((unsigned int)right));
+}
+
+
+
+STATIC int16_t
+FUNC_NAME(unary_minus_func_int16_t_s)(int16_t si LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+#if (INT16_MAX>=INT_MAX)
+ (si==INT16_MIN) ?
+ (UNDEFINED(si)) :
+#endif
+#endif
+ -si;
+}
+
+STATIC int16_t
+FUNC_NAME(add_func_int16_t_s_s)(int16_t si1, int16_t si2 LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+#if (INT16_MAX>=INT_MAX)
+ (((si1>0) && (si2>0) && (si1 > (INT16_MAX-si2))) || ((si1<0) && (si2<0) && (si1 < (INT16_MIN-si2)))) ?
+ (UNDEFINED(si1)) :
+#endif
+#endif
+ (si1 + si2);
+}
+
+STATIC int16_t
+FUNC_NAME(sub_func_int16_t_s_s)(int16_t si1, int16_t si2 LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+#if (INT16_MAX>=INT_MAX)
+ (((si1^si2) & (((si1 ^ ((si1^si2) & (~INT16_MAX)))-si2)^si2)) < 0) ?
+ (UNDEFINED(si1)) :
+#endif
+#endif
+ (si1 - si2);
+}
+
+STATIC int16_t
+FUNC_NAME(mul_func_int16_t_s_s)(int16_t si1, int16_t si2 LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+#if (INT16_MAX>=INT_MAX)
+ (((si1 > 0) && (si2 > 0) && (si1 > (INT16_MAX / si2))) || ((si1 > 0) && (si2 <= 0) && (si2 < (INT16_MIN / si1))) || ((si1 <= 0) && (si2 > 0) && (si1 < (INT16_MIN / si2))) || ((si1 <= 0) && (si2 <= 0) && (si1 != 0) && (si2 < (INT16_MAX / si1)))) ?
+ (UNDEFINED(si1)) :
+#endif
+#endif
+ si1 * si2;
+}
+
+STATIC int16_t
+FUNC_NAME(mod_func_int16_t_s_s)(int16_t si1, int16_t si2 LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ ((si2 == 0) || ((si1 == INT16_MIN) && (si2 == (-1)))) ?
+ (UNDEFINED(si1)) :
+#endif
+ (si1 % si2);
+}
+
+STATIC int16_t
+FUNC_NAME(div_func_int16_t_s_s)(int16_t si1, int16_t si2 LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ ((si2 == 0) || ((si1 == INT16_MIN) && (si2 == (-1)))) ?
+ (UNDEFINED(si1)) :
+#endif
+ (si1 / si2);
+}
+
+STATIC int16_t
+FUNC_NAME(lshift_func_int16_t_s_s)(int16_t left, int right LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ ((left < 0) || (((int)right) < 0) || (((int)right) >= 32) || (left > (INT16_MAX >> ((int)right)))) ?
+ (UNDEFINED(left)) :
+#endif
+ (left << ((int)right));
+}
+
+STATIC int16_t
+FUNC_NAME(lshift_func_int16_t_s_u)(int16_t left, unsigned int right LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ ((left < 0) || (((unsigned int)right) >= 32) || (left > (INT16_MAX >> ((unsigned int)right)))) ?
+ (UNDEFINED(left)) :
+#endif
+ (left << ((unsigned int)right));
+}
+
+STATIC int16_t
+FUNC_NAME(rshift_func_int16_t_s_s)(int16_t left, int right LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ ((left < 0) || (((int)right) < 0) || (((int)right) >= 32))?
+ (UNDEFINED(left)) :
+#endif
+ (left >> ((int)right));
+}
+
+STATIC int16_t
+FUNC_NAME(rshift_func_int16_t_s_u)(int16_t left, unsigned int right LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ ((left < 0) || (((unsigned int)right) >= 32)) ?
+ (UNDEFINED(left)) :
+#endif
+ (left >> ((unsigned int)right));
+}
+
+
+
+STATIC int32_t
+FUNC_NAME(unary_minus_func_int32_t_s)(int32_t si LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+#if (INT32_MAX>=INT_MAX)
+ (si==INT32_MIN) ?
+ (UNDEFINED(si)) :
+#endif
+#endif
+ -si;
+}
+
+STATIC int32_t
+FUNC_NAME(add_func_int32_t_s_s)(int32_t si1, int32_t si2 LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+#if (INT32_MAX>=INT_MAX)
+ (((si1>0) && (si2>0) && (si1 > (INT32_MAX-si2))) || ((si1<0) && (si2<0) && (si1 < (INT32_MIN-si2)))) ?
+ (UNDEFINED(si1)) :
+#endif
+#endif
+ (si1 + si2);
+}
+
+STATIC int32_t
+FUNC_NAME(sub_func_int32_t_s_s)(int32_t si1, int32_t si2 LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+#if (INT32_MAX>=INT_MAX)
+ (((si1^si2) & (((si1 ^ ((si1^si2) & (~INT32_MAX)))-si2)^si2)) < 0) ?
+ (UNDEFINED(si1)) :
+#endif
+#endif
+ (si1 - si2);
+}
+
+STATIC int32_t
+FUNC_NAME(mul_func_int32_t_s_s)(int32_t si1, int32_t si2 LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+#if (INT32_MAX>=INT_MAX)
+ (((si1 > 0) && (si2 > 0) && (si1 > (INT32_MAX / si2))) || ((si1 > 0) && (si2 <= 0) && (si2 < (INT32_MIN / si1))) || ((si1 <= 0) && (si2 > 0) && (si1 < (INT32_MIN / si2))) || ((si1 <= 0) && (si2 <= 0) && (si1 != 0) && (si2 < (INT32_MAX / si1)))) ?
+ (UNDEFINED(si1)) :
+#endif
+#endif
+ si1 * si2;
+}
+
+STATIC int32_t
+FUNC_NAME(mod_func_int32_t_s_s)(int32_t si1, int32_t si2 LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ ((si2 == 0) || ((si1 == INT32_MIN) && (si2 == (-1)))) ?
+ (UNDEFINED(si1)) :
+#endif
+ (si1 % si2);
+}
+
+STATIC int32_t
+FUNC_NAME(div_func_int32_t_s_s)(int32_t si1, int32_t si2 LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ ((si2 == 0) || ((si1 == INT32_MIN) && (si2 == (-1)))) ?
+ (UNDEFINED(si1)) :
+#endif
+ (si1 / si2);
+}
+
+STATIC int32_t
+FUNC_NAME(lshift_func_int32_t_s_s)(int32_t left, int right LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ ((left < 0) || (((int)right) < 0) || (((int)right) >= 32) || (left > (INT32_MAX >> ((int)right)))) ?
+ (UNDEFINED(left)) :
+#endif
+ (left << ((int)right));
+}
+
+STATIC int32_t
+FUNC_NAME(lshift_func_int32_t_s_u)(int32_t left, unsigned int right LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ ((left < 0) || (((unsigned int)right) >= 32) || (left > (INT32_MAX >> ((unsigned int)right)))) ?
+ (UNDEFINED(left)) :
+#endif
+ (left << ((unsigned int)right));
+}
+
+STATIC int32_t
+FUNC_NAME(rshift_func_int32_t_s_s)(int32_t left, int right LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ ((left < 0) || (((int)right) < 0) || (((int)right) >= 32))?
+ (UNDEFINED(left)) :
+#endif
+ (left >> ((int)right));
+}
+
+STATIC int32_t
+FUNC_NAME(rshift_func_int32_t_s_u)(int32_t left, unsigned int right LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ ((left < 0) || (((unsigned int)right) >= 32)) ?
+ (UNDEFINED(left)) :
+#endif
+ (left >> ((unsigned int)right));
+}
+
+#ifndef NO_LONGLONG
+
+
+STATIC int64_t
+FUNC_NAME(unary_minus_func_int64_t_s)(int64_t si LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+#if (INT64_MAX>=INT_MAX)
+ (si==INT64_MIN) ?
+ (UNDEFINED(si)) :
+#endif
+#endif
+ -si;
+}
+
+STATIC int64_t
+FUNC_NAME(add_func_int64_t_s_s)(int64_t si1, int64_t si2 LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+#if (INT64_MAX>=INT_MAX)
+ (((si1>0) && (si2>0) && (si1 > (INT64_MAX-si2))) || ((si1<0) && (si2<0) && (si1 < (INT64_MIN-si2)))) ?
+ (UNDEFINED(si1)) :
+#endif
+#endif
+ (si1 + si2);
+}
+
+STATIC int64_t
+FUNC_NAME(sub_func_int64_t_s_s)(int64_t si1, int64_t si2 LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+#if (INT64_MAX>=INT_MAX)
+ (((si1^si2) & (((si1 ^ ((si1^si2) & (~INT64_MAX)))-si2)^si2)) < 0) ?
+ (UNDEFINED(si1)) :
+#endif
+#endif
+ (si1 - si2);
+}
+
+STATIC int64_t
+FUNC_NAME(mul_func_int64_t_s_s)(int64_t si1, int64_t si2 LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+#if (INT64_MAX>=INT_MAX)
+ (((si1 > 0) && (si2 > 0) && (si1 > (INT64_MAX / si2))) || ((si1 > 0) && (si2 <= 0) && (si2 < (INT64_MIN / si1))) || ((si1 <= 0) && (si2 > 0) && (si1 < (INT64_MIN / si2))) || ((si1 <= 0) && (si2 <= 0) && (si1 != 0) && (si2 < (INT64_MAX / si1)))) ?
+ (UNDEFINED(si1)) :
+#endif
+#endif
+ si1 * si2;
+}
+
+STATIC int64_t
+FUNC_NAME(mod_func_int64_t_s_s)(int64_t si1, int64_t si2 LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ ((si2 == 0) || ((si1 == INT64_MIN) && (si2 == (-1)))) ?
+ (UNDEFINED(si1)) :
+#endif
+ (si1 % si2);
+}
+
+STATIC int64_t
+FUNC_NAME(div_func_int64_t_s_s)(int64_t si1, int64_t si2 LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ ((si2 == 0) || ((si1 == INT64_MIN) && (si2 == (-1)))) ?
+ (UNDEFINED(si1)) :
+#endif
+ (si1 / si2);
+}
+
+STATIC int64_t
+FUNC_NAME(lshift_func_int64_t_s_s)(int64_t left, int right LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ ((left < 0) || (((int)right) < 0) || (((int)right) >= 32) || (left > (INT64_MAX >> ((int)right)))) ?
+ (UNDEFINED(left)) :
+#endif
+ (left << ((int)right));
+}
+
+STATIC int64_t
+FUNC_NAME(lshift_func_int64_t_s_u)(int64_t left, unsigned int right LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ ((left < 0) || (((unsigned int)right) >= 32) || (left > (INT64_MAX >> ((unsigned int)right)))) ?
+ (UNDEFINED(left)) :
+#endif
+ (left << ((unsigned int)right));
+}
+
+STATIC int64_t
+FUNC_NAME(rshift_func_int64_t_s_s)(int64_t left, int right LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ ((left < 0) || (((int)right) < 0) || (((int)right) >= 32))?
+ (UNDEFINED(left)) :
+#endif
+ (left >> ((int)right));
+}
+
+STATIC int64_t
+FUNC_NAME(rshift_func_int64_t_s_u)(int64_t left, unsigned int right LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ ((left < 0) || (((unsigned int)right) >= 32)) ?
+ (UNDEFINED(left)) :
+#endif
+ (left >> ((unsigned int)right));
+}
+
+#endif
+
+
+
+
+
+STATIC uint8_t
+FUNC_NAME(unary_minus_func_uint8_t_u)(uint8_t ui LOG_INDEX)
+{
+ LOG_EXEC
+ return -ui;
+}
+
+STATIC uint8_t
+FUNC_NAME(add_func_uint8_t_u_u)(uint8_t ui1, uint8_t ui2 LOG_INDEX)
+{
+ LOG_EXEC
+ return ui1 + ui2;
+}
+
+STATIC uint8_t
+FUNC_NAME(sub_func_uint8_t_u_u)(uint8_t ui1, uint8_t ui2 LOG_INDEX)
+{
+ LOG_EXEC
+ return ui1 - ui2;
+}
+
+STATIC uint8_t
+FUNC_NAME(mul_func_uint8_t_u_u)(uint8_t ui1, uint8_t ui2 LOG_INDEX)
+{
+ LOG_EXEC
+ return ((unsigned int)ui1) * ((unsigned int)ui2);
+}
+
+STATIC uint8_t
+FUNC_NAME(mod_func_uint8_t_u_u)(uint8_t ui1, uint8_t ui2 LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ (ui2 == 0) ?
+ (UNDEFINED(ui1)) :
+#endif
+ (ui1 % ui2);
+}
+
+STATIC uint8_t
+FUNC_NAME(div_func_uint8_t_u_u)(uint8_t ui1, uint8_t ui2 LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ (ui2 == 0) ?
+ (UNDEFINED(ui1)) :
+#endif
+ (ui1 / ui2);
+}
+
+STATIC uint8_t
+FUNC_NAME(lshift_func_uint8_t_u_s)(uint8_t left, int right LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ ((((int)right) < 0) || (((int)right) >= 32) || (left > (UINT8_MAX >> ((int)right)))) ?
+ (UNDEFINED(left)) :
+#endif
+ (left << ((int)right));
+}
+
+STATIC uint8_t
+FUNC_NAME(lshift_func_uint8_t_u_u)(uint8_t left, unsigned int right LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ ((((unsigned int)right) >= 32) || (left > (UINT8_MAX >> ((unsigned int)right)))) ?
+ (UNDEFINED(left)) :
+#endif
+ (left << ((unsigned int)right));
+}
+
+STATIC uint8_t
+FUNC_NAME(rshift_func_uint8_t_u_s)(uint8_t left, int right LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ ((((int)right) < 0) || (((int)right) >= 32)) ?
+ (UNDEFINED(left)) :
+#endif
+ (left >> ((int)right));
+}
+
+STATIC uint8_t
+FUNC_NAME(rshift_func_uint8_t_u_u)(uint8_t left, unsigned int right LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ (((unsigned int)right) >= 32) ?
+ (UNDEFINED(left)) :
+#endif
+ (left >> ((unsigned int)right));
+}
+
+
+
+STATIC uint16_t
+FUNC_NAME(unary_minus_func_uint16_t_u)(uint16_t ui LOG_INDEX)
+{
+ LOG_EXEC
+ return -ui;
+}
+
+STATIC uint16_t
+FUNC_NAME(add_func_uint16_t_u_u)(uint16_t ui1, uint16_t ui2 LOG_INDEX)
+{
+ LOG_EXEC
+ return ui1 + ui2;
+}
+
+STATIC uint16_t
+FUNC_NAME(sub_func_uint16_t_u_u)(uint16_t ui1, uint16_t ui2 LOG_INDEX)
+{
+ LOG_EXEC
+ return ui1 - ui2;
+}
+
+STATIC uint16_t
+FUNC_NAME(mul_func_uint16_t_u_u)(uint16_t ui1, uint16_t ui2 LOG_INDEX)
+{
+ LOG_EXEC
+ return ((unsigned int)ui1) * ((unsigned int)ui2);
+}
+
+STATIC uint16_t
+FUNC_NAME(mod_func_uint16_t_u_u)(uint16_t ui1, uint16_t ui2 LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ (ui2 == 0) ?
+ (UNDEFINED(ui1)) :
+#endif
+ (ui1 % ui2);
+}
+
+STATIC uint16_t
+FUNC_NAME(div_func_uint16_t_u_u)(uint16_t ui1, uint16_t ui2 LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ (ui2 == 0) ?
+ (UNDEFINED(ui1)) :
+#endif
+ (ui1 / ui2);
+}
+
+STATIC uint16_t
+FUNC_NAME(lshift_func_uint16_t_u_s)(uint16_t left, int right LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ ((((int)right) < 0) || (((int)right) >= 32) || (left > (UINT16_MAX >> ((int)right)))) ?
+ (UNDEFINED(left)) :
+#endif
+ (left << ((int)right));
+}
+
+STATIC uint16_t
+FUNC_NAME(lshift_func_uint16_t_u_u)(uint16_t left, unsigned int right LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ ((((unsigned int)right) >= 32) || (left > (UINT16_MAX >> ((unsigned int)right)))) ?
+ (UNDEFINED(left)) :
+#endif
+ (left << ((unsigned int)right));
+}
+
+STATIC uint16_t
+FUNC_NAME(rshift_func_uint16_t_u_s)(uint16_t left, int right LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ ((((int)right) < 0) || (((int)right) >= 32)) ?
+ (UNDEFINED(left)) :
+#endif
+ (left >> ((int)right));
+}
+
+STATIC uint16_t
+FUNC_NAME(rshift_func_uint16_t_u_u)(uint16_t left, unsigned int right LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ (((unsigned int)right) >= 32) ?
+ (UNDEFINED(left)) :
+#endif
+ (left >> ((unsigned int)right));
+}
+
+
+
+STATIC uint32_t
+FUNC_NAME(unary_minus_func_uint32_t_u)(uint32_t ui LOG_INDEX)
+{
+ LOG_EXEC
+ return -ui;
+}
+
+STATIC uint32_t
+FUNC_NAME(add_func_uint32_t_u_u)(uint32_t ui1, uint32_t ui2 LOG_INDEX)
+{
+ LOG_EXEC
+ return ui1 + ui2;
+}
+
+STATIC uint32_t
+FUNC_NAME(sub_func_uint32_t_u_u)(uint32_t ui1, uint32_t ui2 LOG_INDEX)
+{
+ LOG_EXEC
+ return ui1 - ui2;
+}
+
+STATIC uint32_t
+FUNC_NAME(mul_func_uint32_t_u_u)(uint32_t ui1, uint32_t ui2 LOG_INDEX)
+{
+ LOG_EXEC
+ return ((unsigned int)ui1) * ((unsigned int)ui2);
+}
+
+STATIC uint32_t
+FUNC_NAME(mod_func_uint32_t_u_u)(uint32_t ui1, uint32_t ui2 LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ (ui2 == 0) ?
+ (UNDEFINED(ui1)) :
+#endif
+ (ui1 % ui2);
+}
+
+STATIC uint32_t
+FUNC_NAME(div_func_uint32_t_u_u)(uint32_t ui1, uint32_t ui2 LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ (ui2 == 0) ?
+ (UNDEFINED(ui1)) :
+#endif
+ (ui1 / ui2);
+}
+
+STATIC uint32_t
+FUNC_NAME(lshift_func_uint32_t_u_s)(uint32_t left, int right LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ ((((int)right) < 0) || (((int)right) >= 32) || (left > (UINT32_MAX >> ((int)right)))) ?
+ (UNDEFINED(left)) :
+#endif
+ (left << ((int)right));
+}
+
+STATIC uint32_t
+FUNC_NAME(lshift_func_uint32_t_u_u)(uint32_t left, unsigned int right LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ ((((unsigned int)right) >= 32) || (left > (UINT32_MAX >> ((unsigned int)right)))) ?
+ (UNDEFINED(left)) :
+#endif
+ (left << ((unsigned int)right));
+}
+
+STATIC uint32_t
+FUNC_NAME(rshift_func_uint32_t_u_s)(uint32_t left, int right LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ ((((int)right) < 0) || (((int)right) >= 32)) ?
+ (UNDEFINED(left)) :
+#endif
+ (left >> ((int)right));
+}
+
+STATIC uint32_t
+FUNC_NAME(rshift_func_uint32_t_u_u)(uint32_t left, unsigned int right LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ (((unsigned int)right) >= 32) ?
+ (UNDEFINED(left)) :
+#endif
+ (left >> ((unsigned int)right));
+}
+
+#ifndef NO_LONGLONG
+
+
+STATIC uint64_t
+FUNC_NAME(unary_minus_func_uint64_t_u)(uint64_t ui LOG_INDEX)
+{
+ LOG_EXEC
+ return -ui;
+}
+
+STATIC uint64_t
+FUNC_NAME(add_func_uint64_t_u_u)(uint64_t ui1, uint64_t ui2 LOG_INDEX)
+{
+ LOG_EXEC
+ return ui1 + ui2;
+}
+
+STATIC uint64_t
+FUNC_NAME(sub_func_uint64_t_u_u)(uint64_t ui1, uint64_t ui2 LOG_INDEX)
+{
+ LOG_EXEC
+ return ui1 - ui2;
+}
+
+STATIC uint64_t
+FUNC_NAME(mul_func_uint64_t_u_u)(uint64_t ui1, uint64_t ui2 LOG_INDEX)
+{
+ LOG_EXEC
+ return ((unsigned long long int)ui1) * ((unsigned long long int)ui2);
+}
+
+STATIC uint64_t
+FUNC_NAME(mod_func_uint64_t_u_u)(uint64_t ui1, uint64_t ui2 LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ (ui2 == 0) ?
+ (UNDEFINED(ui1)) :
+#endif
+ (ui1 % ui2);
+}
+
+STATIC uint64_t
+FUNC_NAME(div_func_uint64_t_u_u)(uint64_t ui1, uint64_t ui2 LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ (ui2 == 0) ?
+ (UNDEFINED(ui1)) :
+#endif
+ (ui1 / ui2);
+}
+
+STATIC uint64_t
+FUNC_NAME(lshift_func_uint64_t_u_s)(uint64_t left, int right LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ ((((int)right) < 0) || (((int)right) >= 32) || (left > (UINT64_MAX >> ((int)right)))) ?
+ (UNDEFINED(left)) :
+#endif
+ (left << ((int)right));
+}
+
+STATIC uint64_t
+FUNC_NAME(lshift_func_uint64_t_u_u)(uint64_t left, unsigned int right LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ ((((unsigned int)right) >= 32) || (left > (UINT64_MAX >> ((unsigned int)right)))) ?
+ (UNDEFINED(left)) :
+#endif
+ (left << ((unsigned int)right));
+}
+
+STATIC uint64_t
+FUNC_NAME(rshift_func_uint64_t_u_s)(uint64_t left, int right LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ ((((int)right) < 0) || (((int)right) >= 32)) ?
+ (UNDEFINED(left)) :
+#endif
+ (left >> ((int)right));
+}
+
+STATIC uint64_t
+FUNC_NAME(rshift_func_uint64_t_u_u)(uint64_t left, unsigned int right LOG_INDEX)
+{
+ LOG_EXEC
+ return
+#ifndef UNSAFE
+ (((unsigned int)right) >= 32) ?
+ (UNDEFINED(left)) :
+#endif
+ (left >> ((unsigned int)right));
+}
+
+#endif
+
+#endif
diff --git a/tests/gears.png b/tests/gears.png
index ffb855c4..a35db625 100644
--- a/tests/gears.png
+++ b/tests/gears.png
Binary files differ
diff --git a/tests/gl_ps.c b/tests/gl_ps.c
index 81579c1d..6ea0e3db 100644
--- a/tests/gl_ps.c
+++ b/tests/gl_ps.c
@@ -78,6 +78,9 @@ void shaders() {
glLinkProgram(program);
glGetProgramiv(program, GL_LINK_STATUS, &ok);
assert(ok);
+ assert(glIsProgram(program));
+ assert(!glIsProgram(0));
+ assert(!glIsProgram(program+1)); // a number that can't be a real shader
glUseProgram(program);
diff --git a/tests/gl_ps.png b/tests/gl_ps.png
index 185f7166..ac13ec0b 100644
--- a/tests/gl_ps.png
+++ b/tests/gl_ps.png
Binary files differ
diff --git a/tests/gl_ps_workaround2.c b/tests/gl_ps_workaround2.c
new file mode 100644
index 00000000..e5bd2fd1
--- /dev/null
+++ b/tests/gl_ps_workaround2.c
@@ -0,0 +1,230 @@
+/*******************************************************************
+ * *
+ * Using SDL With OpenGL *
+ * *
+ * Tutorial by Kyle Foley (sdw) *
+ * *
+ * http://gpwiki.org/index.php/SDL:Tutorials:Using_SDL_with_OpenGL *
+ * *
+ *******************************************************************/
+
+/*
+THIS WORK, INCLUDING THE SOURCE CODE, DOCUMENTATION
+AND RELATED MEDIA AND DATA, IS PLACED INTO THE PUBLIC DOMAIN.
+
+THE ORIGINAL AUTHOR IS KYLE FOLEY.
+
+THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY
+OF ANY KIND, NOT EVEN THE IMPLIED WARRANTY OF
+MERCHANTABILITY. THE AUTHOR OF THIS SOFTWARE,
+ASSUMES _NO_ RESPONSIBILITY FOR ANY CONSEQUENCE
+RESULTING FROM THE USE, MODIFICATION, OR
+REDISTRIBUTION OF THIS SOFTWARE.
+*/
+
+#if !EMSCRIPTEN
+#define USE_GLEW 1
+#endif
+
+#if USE_GLEW
+#include "GL/glew.h"
+#endif
+
+#include "SDL/SDL.h"
+#include "SDL/SDL_image.h"
+#if !USE_GLEW
+#include "SDL/SDL_opengl.h"
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+void shaders() {
+#if USE_GLEW
+ glewInit();
+#endif
+
+ GLint ok;
+
+ const char *vertexShader = "void main(void) \n"
+ "{ \n"
+ " gl_Position = ftransform(); \n"
+ " gl_TexCoord[0] = gl_MultiTexCoord0; \n"
+ " gl_FrontColor = gl_Color; \n"
+ "} \n";
+ const char *fragmentShader = "uniform sampler2D tex0; \n"
+ "void main(void) \n"
+ "{ \n"
+ " gl_FragColor = gl_Color * texture2D(tex0, gl_TexCoord[0].xy); \n"
+ "} \n";
+
+ GLuint vs = glCreateShader(GL_VERTEX_SHADER);
+ glShaderSource(vs, 1, &vertexShader, NULL);
+ glCompileShader(vs);
+ glGetShaderiv(vs, GL_COMPILE_STATUS, &ok);
+ assert(ok);
+
+ GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
+ glShaderSource(fs, 1, &fragmentShader, NULL);
+ glCompileShader(fs);
+ glGetShaderiv(fs, GL_COMPILE_STATUS, &ok);
+ assert(ok);
+
+ GLuint program = glCreateProgram();
+
+ glAttachShader(program, vs);
+ glAttachShader(program, fs);
+ glLinkProgram(program);
+ glGetProgramiv(program, GL_LINK_STATUS, &ok);
+ assert(ok);
+
+ glUseProgram(program);
+}
+
+int main(int argc, char *argv[])
+{
+ SDL_Surface *screen;
+
+ // Slightly different SDL initialization
+ if ( SDL_Init(SDL_INIT_VIDEO) != 0 ) {
+ printf("Unable to initialize SDL: %s\n", SDL_GetError());
+ return 1;
+ }
+
+ SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); // *new*
+
+ screen = SDL_SetVideoMode( 640, 480, 16, SDL_OPENGL ); // *changed*
+ if ( !screen ) {
+ printf("Unable to set video mode: %s\n", SDL_GetError());
+ return 1;
+ }
+
+ // Set the OpenGL state after creating the context with SDL_SetVideoMode
+
+ glClearColor( 0, 0, 0, 0 );
+
+#if !EMSCRIPTEN
+ glEnable( GL_TEXTURE_2D ); // Need this to display a texture XXX unnecessary in OpenGL ES 2.0/WebGL
+#endif
+
+ glViewport( 0, 0, 640, 480 );
+
+ glMatrixMode( GL_PROJECTION );
+ GLfloat matrixData[] = { 2.0/640, 0, 0, 0,
+ 0, -2.0/480, 0, 0,
+ 0, 0, -1, 0,
+ -1, 1, 0, 1 };
+ glLoadMatrixf(matrixData); // test loadmatrix
+
+ glMatrixMode( GL_MODELVIEW );
+ glLoadIdentity();
+
+ // Load the OpenGL texture
+
+ GLuint texture; // Texture object handle
+ SDL_Surface *surface; // Gives us the information to make the texture
+
+ if ( (surface = IMG_Load("screenshot.png")) ) {
+
+ // Check that the image's width is a power of 2
+ if ( (surface->w & (surface->w - 1)) != 0 ) {
+ printf("warning: image.bmp's width is not a power of 2\n");
+ }
+
+ // Also check if the height is a power of 2
+ if ( (surface->h & (surface->h - 1)) != 0 ) {
+ printf("warning: image.bmp's height is not a power of 2\n");
+ }
+
+ // Have OpenGL generate a texture object handle for us
+ glGenTextures( 1, &texture );
+
+ // Bind the texture object
+ glBindTexture( GL_TEXTURE_2D, texture );
+
+ // Set the texture's stretching properties
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
+
+ //SDL_LockSurface(surface);
+
+ // Add some greyness
+ memset(surface->pixels, 0x66, surface->w*surface->h);
+
+ // Edit the texture object's image data using the information SDL_Surface gives us
+ glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, surface->w, surface->h, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, surface->pixels );
+
+ //SDL_UnlockSurface(surface);
+ }
+ else {
+ printf("SDL could not load image.bmp: %s\n", SDL_GetError());
+ SDL_Quit();
+ return 1;
+ }
+
+ // Free the SDL_Surface only if it was successfully created
+ if ( surface ) {
+ SDL_FreeSurface( surface );
+ }
+
+ // Clear the screen before drawing
+ glClear( GL_COLOR_BUFFER_BIT );
+
+ shaders();
+
+ // Bind the texture to which subsequent calls refer to
+ glBindTexture( GL_TEXTURE_2D, texture );
+
+ // Use clientside vertex pointers to render two items. In this test we have each
+ // attribute in a separate buffer, packed (i.e. stride == 0)
+ GLfloat vertexData[] = { 10, 10,
+ 300, 10,
+ 300, 128,
+ 10, 128,
+ 410, 10,
+ 600, 10,
+ 630, 200,
+ 310, 250,
+ 100, 300,
+ 300, 300,
+ 300, 400,
+ 100, 400 };
+ GLfloat textureData[] = { 0, 0,
+ 1, 0,
+ 1, 1,
+ 0, 1,
+ 0, 0.5,
+ 1, 0.5,
+ 1, 1,
+ 0.5, 1,
+ 0, 0,
+ 1, 0,
+ 1, 1,
+ 0, 1, };
+
+ glEnable(GL_TEXTURE_2D); // XXX should be GL_TEXTURE_COORD_ARRAY); and also glEnableClientState! XXX two workarounds here
+ glTexCoordPointer(2, GL_FLOAT, 0, textureData);
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(2, GL_FLOAT, 0, vertexData);
+
+ glDrawArrays(GL_QUADS, 0, 12);
+
+ glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+ glDisableClientState(GL_VERTEX_ARRAY);
+
+ SDL_GL_SwapBuffers();
+
+#if !EMSCRIPTEN
+ // Wait for 3 seconds to give us a chance to see the image
+ SDL_Delay(3000);
+#endif
+
+ // Now we can delete the OpenGL texture and close down SDL
+ glDeleteTextures( 1, &texture );
+
+ SDL_Quit();
+
+ return 0;
+}
diff --git a/tests/glbook/CH13_ParticleSystem.png b/tests/glbook/CH13_ParticleSystem.png
index ff9c3496..4b69414f 100644
--- a/tests/glbook/CH13_ParticleSystem.png
+++ b/tests/glbook/CH13_ParticleSystem.png
Binary files differ
diff --git a/tests/glbook/Chapter_13/ParticleSystem/ParticleSystem_orig.c b/tests/glbook/Chapter_13/ParticleSystem/ParticleSystem_orig.c
index 378d05a7..02fddd9c 100644
--- a/tests/glbook/Chapter_13/ParticleSystem/ParticleSystem_orig.c
+++ b/tests/glbook/Chapter_13/ParticleSystem/ParticleSystem_orig.c
@@ -17,9 +17,16 @@
#include <math.h>
#include "esUtil.h"
-#define NUM_PARTICLES 1000
+#define NUM_PARTICLES 2000
#define PARTICLE_SIZE 7
+int randomTemp = 8765;
+float myrandom() {
+ int curr = randomTemp;
+ randomTemp = (1140671485 * randomTemp + 12820163) % 4294967296;
+ return ((float)curr) / 4294967296;
+}
+
typedef struct
{
// Handle to a program object
@@ -145,17 +152,17 @@ int Init ( ESContext *esContext )
float *particleData = &userData->particleData[i * PARTICLE_SIZE];
// Lifetime of particle
- (*particleData++) = ( (float)(rand() % 10000) / 10000.0f );
+ (*particleData++) = myrandom();
// End position of particle
- (*particleData++) = ( (float)(rand() % 10000) / 5000.0f ) - 1.0f;
- (*particleData++) = ( (float)(rand() % 10000) / 5000.0f ) - 1.0f;
- (*particleData++) = ( (float)(rand() % 10000) / 5000.0f ) - 1.0f;
+ (*particleData++) = myrandom() * 2 - 1.0f;
+ (*particleData++) = myrandom() * 2 - 1.0f;
+ (*particleData++) = myrandom() * 2 - 1.0f;
// Start position of particle
- (*particleData++) = ( (float)(rand() % 10000) / 40000.0f ) - 0.125f;
- (*particleData++) = ( (float)(rand() % 10000) / 40000.0f ) - 0.125f;
- (*particleData++) = ( (float)(rand() % 10000) / 40000.0f ) - 0.125f;
+ (*particleData++) = myrandom() * 0.25 - 0.125f;
+ (*particleData++) = myrandom() * 0.25 - 0.125f;
+ (*particleData++) = myrandom() * 0.25 - 0.125f;
}
@@ -188,17 +195,17 @@ void Update ( ESContext *esContext, float deltaTime )
userData->time = 0.0f;
// Pick a new start location and color
- centerPos[0] = ( (float)(rand() % 10000) / 10000.0f ) - 0.5f;
- centerPos[1] = ( (float)(rand() % 10000) / 10000.0f ) - 0.5f;
- centerPos[2] = ( (float)(rand() % 10000) / 10000.0f ) - 0.5f;
+ centerPos[0] = myrandom() - 0.5f;
+ centerPos[1] = myrandom() - 0.5f;
+ centerPos[2] = myrandom() - 0.5f;
glUniform3fv ( userData->centerPositionLoc, 1, &centerPos[0] );
// Random color
- color[0] = ( (float)(rand() % 10000) / 20000.0f ) + 0.5f;
- color[1] = ( (float)(rand() % 10000) / 20000.0f ) + 0.5f;
- color[2] = ( (float)(rand() % 10000) / 20000.0f ) + 0.5f;
- color[3] = 0.5;
+ color[0] = myrandom() * 0.5 + 0.5f;
+ color[1] = myrandom() * 0.5 + 0.5f;
+ color[2] = myrandom() * 0.5 + 0.5f;
+ color[3] = 1.0;
glUniform4fv ( userData->colorLoc, 1, &color[0] );
}
@@ -252,6 +259,8 @@ void Draw ( ESContext *esContext )
// Set the sampler texture unit to 0
glUniform1i ( userData->samplerLoc, 0 );
+ Update ( esContext, 133 * 0.001125 );
+
glDrawArrays( GL_POINTS, 0, NUM_PARTICLES );
eglSwapBuffers ( esContext->eglDisplay, esContext->eglSurface );
@@ -280,15 +289,18 @@ int main ( int argc, char *argv[] )
esInitContext ( &esContext );
esContext.userData = &userData;
- esCreateWindow ( &esContext, "ParticleSystem", 640, 480, ES_WINDOW_RGB );
+ esCreateWindow ( &esContext, "ParticleSystem", 320, 240, ES_WINDOW_RGB );
if ( !Init ( &esContext ) )
return 0;
esRegisterDrawFunc ( &esContext, Draw );
- esRegisterUpdateFunc ( &esContext, Update );
+ //esRegisterUpdateFunc ( &esContext, Update );
- esMainLoop ( &esContext );
+ Draw (&esContext);
+ Draw (&esContext);
+
+ //esMainLoop ( &esContext );
ShutDown ( &esContext );
}
diff --git a/tests/glbook/Chapter_2/Hello_Triangle/Hello_Triangle_orig.c b/tests/glbook/Chapter_2/Hello_Triangle/Hello_Triangle_orig.c
index fd4c506a..cc25a559 100644
--- a/tests/glbook/Chapter_2/Hello_Triangle/Hello_Triangle_orig.c
+++ b/tests/glbook/Chapter_2/Hello_Triangle/Hello_Triangle_orig.c
@@ -171,7 +171,7 @@ void Draw ( ESContext *esContext )
glVertexAttribPointer ( 0, 3, GL_FLOAT, GL_FALSE, 0, vVertices );
glEnableVertexAttribArray ( 0 );
- glDrawArrays ( GL_TRIANGLES, 0, 3 );
+ glDrawArrays ( GL_TRIANGLES, 0, 3 ); // TODO: need glDrawElements!
}
int main ( int argc, char *argv[] )
diff --git a/tests/glbook/Chapter_9/TextureWrap/TextureWrap_orig.c b/tests/glbook/Chapter_9/TextureWrap/TextureWrap_orig.c
index fe22282f..e3531f04 100644
--- a/tests/glbook/Chapter_9/TextureWrap/TextureWrap_orig.c
+++ b/tests/glbook/Chapter_9/TextureWrap/TextureWrap_orig.c
@@ -243,7 +243,7 @@ int main ( int argc, char *argv[] )
esInitContext ( &esContext );
esContext.userData = &userData;
- esCreateWindow ( &esContext, "MipMap 2D", 640, 480, ES_WINDOW_RGB );
+ esCreateWindow ( &esContext, "MipMap 2D", 320, 240, ES_WINDOW_RGB );
if ( !Init ( &esContext ) )
return 0;
diff --git a/tests/runner.py b/tests/runner.py
index 71035b02..8b6e54af 100755
--- a/tests/runner.py
+++ b/tests/runner.py
@@ -100,14 +100,8 @@ class RunnerCore(unittest.TestCase):
for temp_file in os.listdir(TEMP_DIR):
if temp_file.endswith('.ll'):
self.has_prev_ll = True
-
+
def tearDown(self):
- if self.save_JS:
- for name in os.listdir(self.get_dir()):
- if name.endswith(('.o.js', '.cc.js')):
- suff = '.'.join(name.split('.')[-2:])
- shutil.copy(os.path.join(self.get_dir(), name),
- os.path.join(TEMP_DIR, self.id().replace('__main__.', '').replace('.test_', '.')+'.'+suff))
if not self.save_dir:
# rmtree() fails on Windows if the current working directory is inside the tree.
os.chdir(os.path.join(self.get_dir(), '..'))
@@ -140,6 +134,12 @@ class RunnerCore(unittest.TestCase):
def get_stdout_path(self):
return os.path.join(self.get_dir(), 'stdout')
+ def hardcode_arguments(self, filename, args):
+ # Hardcode in the arguments, so js is portable without manual commandlinearguments
+ if not args: return
+ js = open(filename).read()
+ open(filename, 'w').write(js.replace('var ret = run();', 'var ret = run(%s);' % str(args)))
+
def prep_ll_run(self, filename, ll_file, force_recompile=False, build_ll_hook=None):
if ll_file.endswith(('.bc', '.o')):
if ll_file != filename + '.o':
@@ -435,6 +435,8 @@ process(sys.argv[1])
sys.argv = map(lambda arg: arg if not arg.startswith('test_') else 'default.' + arg, sys.argv)
+test_index = 0
+
if 'benchmark' not in str(sys.argv) and 'sanity' not in str(sys.argv) and 'browser' not in str(sys.argv):
# Tests
@@ -448,29 +450,35 @@ if 'benchmark' not in str(sys.argv) and 'sanity' not in str(sys.argv) and 'brows
class T(RunnerCore): # Short name, to make it more fun to use manually on the commandline
## Does a complete test - builds, runs, checks output, etc.
def do_run(self, src, expected_output, args=[], output_nicerizer=None, output_processor=None, no_build=False, main_file=None, additional_files=[], js_engines=None, post_build=None, basename='src.cpp', libraries=[], includes=[], force_c=False, build_ll_hook=None, extra_emscripten_args=[]):
- if force_c or (main_file is not None and main_file[-2:]) == '.c':
- basename = 'src.c'
- Building.COMPILER = to_cc(Building.COMPILER)
-
- dirname = self.get_dir()
- filename = os.path.join(dirname, basename)
- if not no_build:
- self.build(src, dirname, filename, main_file=main_file, additional_files=additional_files, libraries=libraries, includes=includes,
- build_ll_hook=build_ll_hook, extra_emscripten_args=extra_emscripten_args, post_build=post_build)
-
- # Run in both JavaScript engines, if optimizing - significant differences there (typed arrays)
- if js_engines is None:
- js_engines = JS_ENGINES
- if Settings.USE_TYPED_ARRAYS:
- js_engines = filter(lambda engine: engine != V8_ENGINE, js_engines) # V8 issue 1822
- js_engines = filter(lambda engine: engine not in self.banned_js_engines, js_engines)
- if len(js_engines) == 0: return self.skip('No JS engine present to run this test with. Check %s and the paths therein.' % EM_CONFIG)
- for engine in js_engines:
- js_output = self.run_generated_code(engine, filename + '.o.js', args, output_nicerizer=output_nicerizer)
- self.assertContained(expected_output, js_output.replace('\r\n', '\n'))
- self.assertNotContained('ERROR', js_output)
-
- #shutil.rmtree(dirname) # TODO: leave no trace in memory. But for now nice for debugging
+ if force_c or (main_file is not None and main_file[-2:]) == '.c':
+ basename = 'src.c'
+ Building.COMPILER = to_cc(Building.COMPILER)
+
+ dirname = self.get_dir()
+ filename = os.path.join(dirname, basename)
+ if not no_build:
+ self.build(src, dirname, filename, main_file=main_file, additional_files=additional_files, libraries=libraries, includes=includes,
+ build_ll_hook=build_ll_hook, extra_emscripten_args=extra_emscripten_args, post_build=post_build)
+
+ # Run in both JavaScript engines, if optimizing - significant differences there (typed arrays)
+ if js_engines is None:
+ js_engines = JS_ENGINES
+ if Settings.USE_TYPED_ARRAYS:
+ js_engines = filter(lambda engine: engine != V8_ENGINE, js_engines) # V8 issue 1822
+ js_engines = filter(lambda engine: engine not in self.banned_js_engines, js_engines)
+ if len(js_engines) == 0: return self.skip('No JS engine present to run this test with. Check %s and the paths therein.' % EM_CONFIG)
+ for engine in js_engines:
+ js_output = self.run_generated_code(engine, filename + '.o.js', args, output_nicerizer=output_nicerizer)
+ self.assertContained(expected_output, js_output.replace('\r\n', '\n'))
+ self.assertNotContained('ERROR', js_output)
+
+ #shutil.rmtree(dirname) # TODO: leave no trace in memory. But for now nice for debugging
+
+ if self.save_JS:
+ global test_index
+ self.hardcode_arguments(filename + '.o.js', args)
+ shutil.copyfile(filename + '.o.js', os.path.join(TEMP_DIR, str(test_index) + '.js'))
+ test_index += 1
# No building - just process an existing .ll file (or .bc, which we turn into .ll)
def do_ll_run(self, ll_file, expected_output=None, args=[], js_engines=None, output_nicerizer=None, post_build=None, force_recompile=False, build_ll_hook=None, extra_emscripten_args=[]):
@@ -499,6 +507,8 @@ if 'benchmark' not in str(sys.argv) and 'sanity' not in str(sys.argv) and 'brows
'''
self.do_run(src, 'hello, world!')
+ assert 'EMSCRIPTEN_GENERATED_FUNCTIONS' not in open(self.in_dir('src.cpp.o.js')).read(), 'must not emit this unneeded internal thing'
+
def test_intvars(self):
if self.emcc_args == None: return self.skip('needs ta2')
@@ -1131,7 +1141,6 @@ m_divisor is 1091269979
def test_i32_mul_precise(self):
if self.emcc_args == None: return self.skip('needs ta2')
- self.emcc_args += ['-s', 'PRECISE_I32_MUL=1']
src = r'''
#include <stdio.h>
@@ -1146,6 +1155,10 @@ m_divisor is 1091269979
self.do_run(src, '3217489085')
def test_i32_mul_semiprecise(self):
+ if Settings.ASM_JS: return self.skip('asm is always fully precise')
+
+ Settings.PRECISE_I32_MUL = 0 # we want semiprecise here
+
src = r'''
#include <stdio.h>
@@ -1807,6 +1820,8 @@ Succeeded!
generated = open('src.cpp.o.js', 'r').read()
def test_stack(self):
+ Settings.INLINING_LIMIT = 50
+
src = '''
#include <stdio.h>
int test(int i) {
@@ -2457,12 +2472,15 @@ Exception execution path of first function! 1
'''
Settings.DISABLE_EXCEPTION_CATCHING = 0
+ if '-O2' in self.emcc_args:
+ self.emcc_args.pop() ; self.emcc_args.pop() # disable closure to work around a closure bug
self.do_run(src, 'Throw...Construct...Catched...Destruct...Throw...Construct...Copy...Catched...Destruct...Destruct...')
def test_white_list_exception(self):
if Settings.ASM_JS: return self.skip('no exceptions support in asm')
Settings.DISABLE_EXCEPTION_CATCHING = 2
Settings.EXCEPTION_CATCHING_WHITELIST = ["__Z12somefunctionv"]
+ Settings.INLINING_LIMIT = 50 # otherwise it is inlined and not identified
src = '''
#include <stdio.h>
@@ -2495,8 +2513,6 @@ Exception execution path of first function! 1
def test_uncaught_exception(self):
if Settings.ASM_JS: return self.skip('no exceptions support in asm')
if self.emcc_args is None: return self.skip('no libcxx inclusion without emcc')
- if '-O2' in self.emcc_args:
- self.emcc_args += ['--closure', '1'] # Use closure here for some additional coverage
Settings.DISABLE_EXCEPTION_CATCHING = 0
@@ -2609,6 +2625,7 @@ Exiting setjmp function, level: 0, prev_jmp: -1
if self.emcc_args is None: return self.skip('requires emcc')
if Settings.ASM_JS: return self.skip('uses report_stack without exporting')
+ Settings.INLINING_LIMIT = 50
Settings.CATCH_EXIT_CODE = 1
src = r'''
@@ -2793,6 +2810,37 @@ Exiting setjmp function, level: 0, prev_jmp: -1
''' % addr
self.do_run(src, 'segmentation fault' if addr.isdigit() else 'marfoosh')
+ def test_safe_dyncalls(self):
+ if Settings.ASM_JS: return self.skip('asm does not support missing function stack traces')
+ if Settings.SAFE_HEAP: return self.skip('safe heap warning will appear instead')
+ if self.emcc_args is None: return self.skip('need libc')
+
+ Settings.SAFE_DYNCALLS = 1
+
+ for cond, body, work in [(True, True, False), (True, False, False), (False, True, True), (False, False, False)]:
+ print cond, body, work
+ src = r'''
+ #include <stdio.h>
+
+ struct Classey {
+ virtual void doIt() = 0;
+ };
+
+ struct D1 : Classey {
+ virtual void doIt() BODY;
+ };
+
+ int main(int argc, char **argv)
+ {
+ Classey *p = argc COND 100 ? new D1() : NULL;
+ printf("%p\n", p);
+ p->doIt();
+
+ return 0;
+ }
+ '''.replace('COND', '==' if cond else '!=').replace('BODY', r'{ printf("all good\n"); }' if body else '')
+ self.do_run(src, 'dyncall error: vi' if not work else 'all good')
+
def test_dynamic_cast(self):
if self.emcc_args is None: return self.skip('need libcxxabi')
@@ -2845,6 +2893,23 @@ Exiting setjmp function, level: 0, prev_jmp: -1
'''
self.do_run(src, 'a1: 0\na2: 0\na3: 1\nb1: 0\nb2: 1\nb3: 1\nc1: 1\nc2: 1\nc3: 1\n')
+ def test_dynamic_cast_2(self):
+ if self.emcc_args is None: return self.skip('need libcxxabi')
+
+ src = r'''
+ #include <stdio.h>
+ #include <typeinfo>
+
+ class Class {};
+
+ int main() {
+ const Class* dp = dynamic_cast<const Class*>(&typeid(Class));
+ // should return dp == NULL,
+ printf("pointer: %p\n", dp);
+ }
+ '''
+ self.do_run(src, "pointer: (nil)")
+
def test_funcptr(self):
src = '''
#include <stdio.h>
@@ -3008,6 +3073,8 @@ Exiting setjmp function, level: 0, prev_jmp: -1
def test_stack_varargs(self):
if self.emcc_args is None: return # too slow in other modes
+ Settings.INLINING_LIMIT = 50
+
# We should not blow up the stack with numerous varargs
src = r'''
#include <stdio.h>
@@ -3028,6 +3095,8 @@ Exiting setjmp function, level: 0, prev_jmp: -1
self.do_run(src, 'ok!')
def test_stack_void(self):
+ Settings.INLINING_LIMIT = 50
+
src = r'''
#include <stdio.h>
@@ -3979,7 +4048,6 @@ The current type of b is: 9
self.do_run(src, 'time: ') # compilation check, mainly
def test_intentional_fault(self):
- if Settings.ASM_JS: return self.skip('no throw support in asm')
# Some programs intentionally segfault themselves, we should compile that into a throw
src = r'''
int main () {
@@ -3987,7 +4055,7 @@ The current type of b is: 9
return 0;
}
'''
- self.do_run(src, 'fault on write to 0')
+ self.do_run(src, 'fault on write to 0' if not Settings.ASM_JS else 'Assertion: 0')
def test_trickystring(self):
src = r'''
@@ -4107,10 +4175,12 @@ The current type of b is: 9
'''
self.do_run(src, '*0.00,0.00,0.00*\n*0,77,0*\n*0,77,0*\n*0,77,0*')
- def test_memcpy(self):
+ def test_memcpy_memcmp(self):
src = '''
#include <stdio.h>
#include <string.h>
+ #include <assert.h>
+
#define MAXX 48
void reset(unsigned char *buffer) {
for (int i = 0; i < MAXX; i++) buffer[i] = i+1;
@@ -4131,6 +4201,20 @@ The current type of b is: 9
reset(buffer);
memcpy(buffer+i, buffer+j, k);
dump(buffer);
+ assert(memcmp(buffer+i, buffer+j, k) == 0);
+ buffer[i + k/2]++;
+ if (buffer[i + k/2] != 0) {
+ assert(memcmp(buffer+i, buffer+j, k) > 0);
+ } else {
+ assert(memcmp(buffer+i, buffer+j, k) < 0);
+ }
+ buffer[i + k/2]--;
+ buffer[j + k/2]++;
+ if (buffer[j + k/2] != 0) {
+ assert(memcmp(buffer+i, buffer+j, k) < 0);
+ } else {
+ assert(memcmp(buffer+i, buffer+j, k) > 0);
+ }
}
}
}
@@ -5001,6 +5085,22 @@ at function.:blag
}
'''
self.do_run(src, '22 : me and myself 25 1.34\n21 waka 95\n')
+
+ def test_perror(self):
+ src = r'''
+ #include <sys/types.h>
+ #include <sys/stat.h>
+ #include <fcntl.h>
+ #include <stdio.h>
+
+ int main( int argc, char** argv ){
+ int retval = open( "NonExistingFile", O_RDONLY );
+ if( retval == -1 )
+ perror( "Cannot open NonExistingFile" );
+ return 0;
+ }
+ '''
+ self.do_run(src, 'Cannot open NonExistingFile: No such file or directory\n')
def test_atoX(self):
if self.emcc_args is None: return self.skip('requires ta2')
@@ -5324,9 +5424,30 @@ Pass: 0.000012 0.000012''')
return(0);
}
'''
-
self.do_run(src, '3\nday 19, month Nov, year 2012');
+ def test_sscanf_5(self):
+ src = r'''
+ #include "stdio.h"
+
+ static const char *colors[] = {
+ " c black",
+ ". c #001100",
+ "X c #111100"
+ };
+
+ int main(){
+ unsigned char code;
+ char color[32];
+ int rcode;
+ for(int i = 0; i < 3; i++) {
+ rcode = sscanf(colors[i], "%c c %s", &code, color);
+ printf("%i, %c, %s\n", rcode, code, color);
+ }
+ }
+ '''
+ self.do_run(src, '2, , black\n2, ., #001100\n2, X, #111100');
+
def test_langinfo(self):
src = open(path_from_root('tests', 'langinfo', 'test.c'), 'r').read()
expected = open(path_from_root('tests', 'langinfo', 'output.txt'), 'r').read()
@@ -6854,8 +6975,9 @@ def process(filename):
# gcc -O3 -I/home/alon/Dev/emscripten/tests/sqlite -ldl src.c
if self.emcc_args is None: return self.skip('Very slow without ta2, and we would also need to include dlmalloc manually without emcc')
if Settings.QUANTUM_SIZE == 1: return self.skip('TODO FIXME')
+ self.banned_js_engines = [NODE_JS] # OOM in older node
- Settings.CORRECT_SIGNS = 1 # XXX: in default, we fail with 2 here, even though the pgo_data should be correct (and works in s_0_0). Investigate this.
+ Settings.CORRECT_SIGNS = 1
Settings.CORRECT_OVERFLOWS = 0
Settings.CORRECT_ROUNDINGS = 0
if self.emcc_args is None: Settings.SAFE_HEAP = 0 # uses time.h to set random bytes, other stuff
@@ -6899,7 +7021,8 @@ def process(filename):
self.do_run(open(path_from_root('tests', 'bullet', 'Demos', 'HelloWorld', 'HelloWorld.cpp'), 'r').read(),
[open(path_from_root('tests', 'bullet', 'output.txt'), 'r').read(), # different roundings
- open(path_from_root('tests', 'bullet', 'output2.txt'), 'r').read()],
+ open(path_from_root('tests', 'bullet', 'output2.txt'), 'r').read(),
+ open(path_from_root('tests', 'bullet', 'output3.txt'), 'r').read()],
libraries=self.get_library('bullet', [os.path.join('src', '.libs', 'libBulletDynamics.a'),
os.path.join('src', '.libs', 'libBulletCollision.a'),
os.path.join('src', '.libs', 'libLinearMath.a')],
@@ -7067,6 +7190,14 @@ def process(filename):
self.assertIdentical(clean(open('release.js').read()), clean(open('debug%d.js' % debug).read())) # EMCC_DEBUG=1 mode must not generate different code!
print >> sys.stderr, 'debug check %d passed too' % debug
+ try:
+ os.environ['EMCC_FORCE_STDLIBS'] = '1'
+ print 'EMCC_FORCE_STDLIBS'
+ do_test()
+ finally:
+ del os.environ['EMCC_FORCE_STDLIBS']
+ print >> sys.stderr, 'EMCC_FORCE_STDLIBS ok'
+
try_delete(CANONICAL_TEMP_DIR)
else:
print >> sys.stderr, 'not doing debug check'
@@ -7134,6 +7265,24 @@ def process(filename):
finally:
del os.environ['EMCC_LEAVE_INPUTS_RAW']
+ def test_fuzz(self):
+ if Settings.USE_TYPED_ARRAYS != 2: return self.skip('needs ta2')
+
+ Building.COMPILER_TEST_OPTS += ['-I' + path_from_root('tests', 'fuzz')]
+
+ def run_all(x):
+ print x
+ for name in glob.glob(path_from_root('tests', 'fuzz', '*.c')):
+ print name
+ self.do_run(open(path_from_root('tests', 'fuzz', name)).read(),
+ open(path_from_root('tests', 'fuzz', name + '.txt')).read(), force_c=True)
+
+ run_all('normal')
+
+ self.emcc_args += ['--llvm-lto', '1']
+
+ run_all('lto')
+
# Autodebug the code
def do_autodebug(self, filename):
output = Popen([PYTHON, AUTODEBUGGER, filename+'.o.ll', filename+'.o.ll.ll'], stdout=PIPE, stderr=self.stderr_redirect).communicate()[0]
@@ -7185,40 +7334,101 @@ def process(filename):
'''
self.do_run(src, '''AD:-1,1''', build_ll_hook=self.do_autodebug)
- def test_profiling(self):
- if Settings.ASM_JS: return self.skip('asm does not support profiling')
+ def test_corruption(self):
+ if Settings.ASM_JS: return self.skip('cannot use corruption checks in asm')
+ if Settings.USE_TYPED_ARRAYS != 2: return self.skip('needs ta2 for actual test')
- src = '''
- #include <emscripten.h>
- #include <unistd.h>
+ Settings.CORRUPTION_CHECK = 1
- int main()
+ src = r'''
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <string.h>
+ int main(int argc, char **argv) {
+ int size = 1024*argc;
+ char *buffer = (char*)malloc(size);
+ #if CORRUPT
+ memset(buffer, argc, size+15);
+ #else
+ memset(buffer, argc, size);
+ #endif
+ for (int x = 0; x < size; x += argc*3) buffer[x] = x/3;
+ int ret = 0;
+ for (int x = 0; x < size; x++) ret += buffer[x];
+ free(buffer);
+ printf("All ok, %d\n", ret);
+ }
+ '''
+
+ for corrupt in [1]:
+ self.do_run(src.replace('CORRUPT', str(corrupt)), 'Heap corruption detected!' if corrupt else 'All ok, 4209')
+
+ def test_corruption_2(self):
+ if Settings.ASM_JS: return self.skip('cannot use corruption checks in asm')
+ if Settings.USE_TYPED_ARRAYS != 2: return self.skip('needs ta2 for actual test')
+
+ Settings.SAFE_HEAP = 1
+ Settings.CORRUPTION_CHECK = 1
+
+ # test for free(0), malloc(0), etc.
+ src = r'''
+ #include <iostream>
+ #include <fstream>
+ #include <stdlib.h>
+ #include <stdio.h>
+
+ void bye() {
+ printf("all ok\n");
+ }
+
+ int main() {
+ atexit(bye);
+
+ std::string testPath = "/Script/WA-KA.txt";
+ std::fstream str(testPath.c_str(), std::ios::in | std::ios::binary);
+
+ if (str.is_open())
{
- EMSCRIPTEN_PROFILE_INIT(3);
- EMSCRIPTEN_PROFILE_BEGIN(0);
- usleep(10 * 1000);
- EMSCRIPTEN_PROFILE_END(0);
- EMSCRIPTEN_PROFILE_BEGIN(1);
- usleep(50 * 1000);
- EMSCRIPTEN_PROFILE_END(1);
- EMSCRIPTEN_PROFILE_BEGIN(2);
- usleep(250 * 1000);
- EMSCRIPTEN_PROFILE_END(2);
- return 0;
+ std::cout << "open!" << std::endl;
+ } else {
+ std::cout << "missing!" << std::endl;
}
+
+ return 1;
+ }
'''
+ self.do_run(src, 'missing!\nall ok\n')
- post1 = '''
-def process(filename):
- src = open(filename, 'a')
- src.write(\'\'\'
- Profiling.dump();
- \'\'\')
- src.close()
-'''
+ def test_corruption_3(self):
+ if Settings.ASM_JS: return self.skip('cannot use corruption checks in asm')
+ if Settings.USE_TYPED_ARRAYS != 2: return self.skip('needs ta2 for actual test')
+
+ Settings.CORRUPTION_CHECK = 1
- self.do_run(src, '''Profiling data:
-Block 0: ''', post_build=post1)
+ # realloc
+ src = r'''
+ #include <stdlib.h>
+ #include <stdio.h>
+ #include <assert.h>
+
+ void bye() {
+ printf("all ok\n");
+ }
+
+ int main(int argc, char **argv) {
+ atexit(bye);
+
+ char *buffer = (char*)malloc(100);
+ for (int i = 0; i < 100; i++) buffer[i] = (i*i)%256;
+ buffer = (char*)realloc(buffer, argc + 50);
+ for (int i = 0; i < argc + 50; i++) {
+ //printf("%d : %d : %d : %d\n", i, (int)(buffer + i), buffer[i], (char)((i*i)%256));
+ assert(buffer[i] == (char)((i*i)%256));
+ }
+ return 1;
+ }
+ '''
+ self.do_run(src, 'all ok\n')
### Integration tests
@@ -7748,6 +7958,8 @@ def process(filename):
def test_debug(self):
if '-g' not in Building.COMPILER_TEST_OPTS: Building.COMPILER_TEST_OPTS.append('-g')
+ if self.emcc_args is not None:
+ if '-O1' in self.emcc_args or '-O2' in self.emcc_args: return self.skip('optimizations remove LLVM debug info')
src = '''
#include <stdio.h>
@@ -8123,7 +8335,6 @@ class %s(T):
Settings.ASSERTIONS = 1-embetter
Settings.SAFE_HEAP = 1-(embetter and llvm_opts)
Building.LLVM_OPTS = llvm_opts
- Settings.PGO = 0
Settings.CHECK_OVERFLOWS = 1-(embetter or llvm_opts)
Settings.CORRECT_OVERFLOWS = 1-(embetter and llvm_opts)
Settings.CORRECT_SIGNS = 0
@@ -8133,7 +8344,6 @@ class %s(T):
Settings.INIT_STACK = 0
Settings.RUNTIME_TYPE_INFO = 0
Settings.DISABLE_EXCEPTION_CATCHING = 0
- Settings.PROFILE = 0
Settings.INCLUDE_FULL_LIBRARY = 0
Settings.BUILD_AS_SHARED_LIB = 0
Settings.RUNTIME_LINKED_LIBS = []
@@ -8156,11 +8366,11 @@ TT = %s
exec('o1 = make_run("o1", compiler=CLANG, emcc_args=["-O1", "-s", "SAFE_HEAP=1"])')
# Make one run with -O2, but without closure (we enable closure in specific tests, otherwise on everything it is too slow)
- exec('o2 = make_run("o2", compiler=CLANG, emcc_args=["-O2", "--closure", "0"])')
+ exec('o2 = make_run("o2", compiler=CLANG, emcc_args=["-O2"])')
# asm.js
- #exec('asm = make_run("asm", compiler=CLANG, emcc_args=["-O0", "--closure", "0", "-s", "ASM_JS=1"])')
- exec('asm2 = make_run("asm2", compiler=CLANG, emcc_args=["-O2", "--closure", "0", "-s", "ASM_JS=1"])')
+ #exec('asm = make_run("asm", compiler=CLANG, emcc_args=["-O0", "-s", "ASM_JS=1"])')
+ exec('asm2 = make_run("asm2", compiler=CLANG, emcc_args=["-O2", "-s", "ASM_JS=1"])')
# Make custom runs with various options
for compiler, quantum, embetter, typed_arrays, llvm_opts in [
@@ -8186,11 +8396,12 @@ TT = %s
# --version
output = Popen([PYTHON, compiler, '--version'], stdout=PIPE, stderr=PIPE).communicate()
- self.assertContained('''emcc (Emscripten GCC-like replacement) 2.0
-Copyright (C) 2012 the Emscripten authors.
+ output = output[0].replace('\r', '')
+ self.assertContained('''emcc (Emscripten GCC-like replacement)''', output)
+ self.assertContained('''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.
-''', output[0].replace('\r', ''), output[1].replace('\r', ''))
+''', output)
# -v, without input files
output = Popen([PYTHON, compiler, '-v'], stdout=PIPE, stderr=PIPE).communicate()
@@ -8296,20 +8507,22 @@ Options that are modified or new in %s include:
(['-o', 'something.js', '-O0'], 0, None, 0, 0),
(['-o', 'something.js', '-O1'], 1, None, 0, 0),
(['-o', 'something.js', '-O1', '--closure', '1'], 1, None, 1, 0),
- (['-o', 'something.js', '-O2'], 2, None, 1, 1),
+ (['-o', 'something.js', '-O2'], 2, None, 0, 1),
(['-o', 'something.js', '-O2', '--closure', '0'], 2, None, 0, 0),
+ (['-o', 'something.js', '-O2', '-g'], 2, None, 0, 0),
(['-o', 'something.js', '-O3'], 3, None, 1, 1),
(['-o', 'something.js', '-O3', '--closure', '0'], 3, None, 0, 0),
# and, test compiling to bitcode first
(['-o', 'something.bc'], 0, [], 0, 0),
(['-o', 'something.bc'], 0, ['-O0'], 0, 0),
(['-o', 'something.bc'], 1, ['-O1'], 0, 0),
- (['-o', 'something.bc'], 2, ['-O2'], 1, 0),
+ (['-o', 'something.bc'], 2, ['-O2'], 0, 0),
(['-o', 'something.bc'], 3, ['-O3'], 1, 0),
(['-O1', '-o', 'something.bc'], 0, [], 0, 0), # -Ox is ignored and warned about
]:
- #print params, opt_level, bc_params, closure
+ print params, opt_level, bc_params, closure, has_malloc
self.clear()
+ keep_debug = '-g' in params
output = Popen([PYTHON, compiler, path_from_root('tests', 'hello_world_loop' + ('_malloc' if has_malloc else '') + '.cpp')] + params,
stdout=PIPE, stderr=PIPE).communicate()
assert len(output[0]) == 0, output[0]
@@ -8333,21 +8546,21 @@ Options that are modified or new in %s include:
else:
# closure has not been run, we can do some additional checks. TODO: figure out how to do these even with closure
assert 'Module._main = ' not in generated, 'closure compiler should not have been run'
- # XXX find a way to test this: assert ('& 255' in generated or '&255' in generated) == (opt_level <= 2), 'corrections should be in opt <= 2'
- assert ('(label)' in generated) == (opt_level <= 1), 'relooping should be in opt >= 2'
- assert ('assert(STACKTOP < STACK_MAX' in generated) == (opt_level == 0), 'assertions should be in opt == 0'
- assert 'var $i;' in generated or 'var $i_0' in generated or 'var $storemerge3;' in generated or 'var $storemerge4;' in generated or 'var $i_04;' in generated, 'micro opts should always be on'
+ if keep_debug:
+ assert ('(label)' in generated) == (opt_level <= 1), 'relooping should be in opt >= 2'
+ assert ('assert(STACKTOP < STACK_MAX' in generated) == (opt_level == 0), 'assertions should be in opt == 0'
+ assert 'var $i;' in generated or 'var $i_0' in generated or 'var $storemerge3;' in generated or 'var $storemerge4;' in generated or 'var $i_04;' in generated, 'micro opts should always be on'
if opt_level >= 2:
- assert re.search('HEAP8\[\$\w+ \+ \(+\$\w+ ', generated) or re.search('HEAP8\[HEAP32\[', generated), 'eliminator should create compound expressions, and fewer one-time vars' # also in -O1, but easier to test in -O2
+ assert re.search('HEAP8\[\$?\w+ \+ \(+\$?\w+ ', generated) or re.search('HEAP8\[HEAP32\[', generated), 'eliminator should create compound expressions, and fewer one-time vars' # also in -O1, but easier to test in -O2
assert ('_puts(' in generated) == (opt_level >= 1), 'with opt >= 1, llvm opts are run and they should optimize printf to puts'
- assert ('function _malloc(bytes) {' in generated) == (not has_malloc), 'If malloc is needed, it should be there, if not not'
assert 'function _main() {' in generated, 'Should be unminified, including whitespace'
- assert ('-O3' in (params+(bc_params or []))) or'function _dump' in generated, 'No inlining by default'
# emcc -s RELOOP=1 src.cpp ==> should pass -s to emscripten.py. --typed-arrays is a convenient alias for -s USE_TYPED_ARRAYS
for params, test, text in [
+ (['-s', 'ASM_JS=1', '-O2'], lambda generated: 'var i1 = 0' in generated, 'registerize is run by default in -O2'),
+ (['-s', 'ASM_JS=1', '-O2', '-g'], lambda generated: 'var i1 = 0' not in generated, 'registerize is cancelled by -g'),
(['-s', 'INLINING_LIMIT=0'], lambda generated: 'function _dump' in generated, 'no inlining without opts'),
- (['-O1', '-s', 'INLINING_LIMIT=0'], lambda generated: 'function _dump' not in generated, 'inlining'),
+ (['-O3', '-s', 'INLINING_LIMIT=0', '--closure', '0'], lambda generated: 'function _dump' not in generated, 'lto/inlining'),
(['-s', 'USE_TYPED_ARRAYS=0'], lambda generated: 'new Int32Array' not in generated, 'disable typed arrays'),
(['-s', 'USE_TYPED_ARRAYS=1'], lambda generated: 'IHEAPU = ' in generated, 'typed arrays 1 selected'),
([], lambda generated: 'Module["_dump"]' not in generated, 'dump is not exported by default'),
@@ -8477,7 +8690,7 @@ f.close()
# Run through node, if CMake produced a .js file.
if cmake_outputs[i].endswith('.js'):
- ret = Popen([NODE_JS, tempdirname + '/' + cmake_outputs[i]], stdout=PIPE).communicate()[0]
+ ret = Popen(listify(NODE_JS) + [tempdirname + '/' + cmake_outputs[i]], stdout=PIPE).communicate()[0]
assert 'hello, world!' in ret, 'Running cmake-based .js application failed!'
finally:
os.chdir(path_from_root('tests')) # Move away from the directory we are about to remove.
@@ -8660,6 +8873,21 @@ f.close()
self.assertContained('result: 62', run_js(os.path.join(self.get_dir(), 'a.out.js')))
+ def test_asm_undefined(self):
+ src = r'''
+ #include <stdio.h>
+ extern void doit();
+ int main(int argc, char **argv) {
+ if (argc == 121) doit();
+ printf("done\n");
+ return 1;
+ }
+ '''
+ filename = self.in_dir('src.cpp')
+ open(filename, 'w').write(src)
+ out, err = Popen([PYTHON, EMCC, filename, '-s', 'ASM_JS=1', '-O2'], stderr=PIPE).communicate()
+ assert 'Warning: Unresolved symbol' in err, 'always warn on undefs in asm, since it breaks validation'
+
def test_redundant_link(self):
lib = "int mult() { return 1; }"
lib_name = os.path.join(self.get_dir(), 'libA.c')
@@ -9083,7 +9311,7 @@ f.close()
return 0;
}
''')
- Popen([PYTHON, EMCC, '-O2', '--closure', '-0', os.path.join(self.get_dir(), 'main.cpp')]).communicate()
+ Popen([PYTHON, EMCC, '-O2', os.path.join(self.get_dir(), 'main.cpp')]).communicate()
output = run_js(os.path.join(self.get_dir(), 'a.out.js'), full_output=True, stderr=PIPE)
self.assertContained('''0:0
1:1
@@ -9269,7 +9497,7 @@ f.close()
(path_from_root('tools', 'test-js-optimizer-asm-last.js'), open(path_from_root('tools', 'test-js-optimizer-asm-last-output.js')).read(),
['asm', 'last']),
]:
- output = Popen([NODE_JS, path_from_root('tools', 'js-optimizer.js'), input] + passes, stdin=PIPE, stdout=PIPE).communicate()[0]
+ output = Popen(listify(NODE_JS) + [path_from_root('tools', 'js-optimizer.js'), input] + passes, stdin=PIPE, stdout=PIPE).communicate()[0]
self.assertIdentical(expected, output.replace('\r\n', '\n').replace('\n\n', '\n'))
def test_m_mm(self):
@@ -9285,8 +9513,8 @@ f.close()
try:
os.environ['EMCC_DEBUG'] = '1'
for asm, linkable, chunks, js_chunks in [
- (0, 0, 3, 2), (0, 1, 7, 4),
- (1, 0, 3, 2), (1, 1, 7, 5)
+ (0, 0, 3, 2), (0, 1, 4, 4),
+ (1, 0, 3, 2), (1, 1, 4, 5)
]:
print asm, linkable, chunks, js_chunks
output, err = Popen([PYTHON, EMCC, path_from_root('tests', 'hello_libcxx.cpp'), '-O1', '-s', 'LINKABLE=%d' % linkable, '-s', 'ASM_JS=%d' % asm], stdout=PIPE, stderr=PIPE).communicate()
@@ -9295,6 +9523,26 @@ f.close()
finally:
del os.environ['EMCC_DEBUG']
+ def test_debuginfo(self):
+ if os.environ.get('EMCC_DEBUG'): return self.skip('cannot run in debug mode')
+ try:
+ os.environ['EMCC_DEBUG'] = '1'
+ # llvm debug info is kept only when we can see it, which is without the js optimize, -O0. js debug info is lost by registerize in -O2, so - g disables it
+ for args, expect_llvm, expect_js in [
+ (['-O0'], True, True),
+ (['-O0', '-g'], True, True),
+ (['-O1'], False, True),
+ (['-O1', '-g'], False, True),
+ (['-O2'], False, False),
+ (['-O2', '-g'], False, True),
+ ]:
+ print args, expect_llvm, expect_js
+ output, err = Popen([PYTHON, EMCC, path_from_root('tests', 'hello_world.cpp')] + args, stdout=PIPE, stderr=PIPE).communicate()
+ assert expect_llvm == ('strip-debug' not in err)
+ assert expect_js == ('registerize' not in err)
+ finally:
+ del os.environ['EMCC_DEBUG']
+
def test_scons(self): # also incidentally tests c++11 integration in llvm 3.1
try_delete(os.path.join(self.get_dir(), 'test'))
shutil.copytree(path_from_root('tests', 'scons'), os.path.join(self.get_dir(), 'test'))
@@ -9445,6 +9693,64 @@ seeked= file.
code = open('a.out.js').read()
assert 'SAFE_HEAP' in code, 'valid -s option had an effect'
+ def test_optimize_normally(self):
+ assert not os.environ.get('EMCC_OPTIMIZE_NORMALLY')
+ assert not os.environ.get('EMCC_DEBUG')
+
+ for optimize_normally in [0, 1]:
+ print optimize_normally
+ try:
+ if optimize_normally: os.environ['EMCC_OPTIMIZE_NORMALLY'] = '1'
+ os.environ['EMCC_DEBUG'] = '1'
+
+ open(self.in_dir('main.cpp'), 'w').write(r'''
+ extern "C" {
+ void something();
+ }
+
+ int main() {
+ something();
+ return 0;
+ }
+ ''')
+ open(self.in_dir('supp.cpp'), 'w').write(r'''
+ #include <stdio.h>
+
+ extern "C" {
+ void something() {
+ printf("yello\n");
+ }
+ }
+ ''')
+ out, err = Popen([PYTHON, EMCC, self.in_dir('main.cpp'), '-O2', '-o', 'main.o'], stdout=PIPE, stderr=PIPE).communicate()
+ assert ("emcc: LLVM opts: ['-O3']" in err) == optimize_normally
+ assert (' with -O3 since EMCC_OPTIMIZE_NORMALLY defined' in err) == optimize_normally
+
+ out, err = Popen([PYTHON, EMCC, self.in_dir('supp.cpp'), '-O2', '-o', 'supp.o'], stdout=PIPE, stderr=PIPE).communicate()
+ assert ("emcc: LLVM opts: ['-O3']" in err) == optimize_normally
+ assert (' with -O3 since EMCC_OPTIMIZE_NORMALLY defined' in err) == optimize_normally
+
+ out, err = Popen([PYTHON, EMCC, self.in_dir('main.o'), self.in_dir('supp.o'), '-O2', '-o', 'both.o'], stdout=PIPE, stderr=PIPE).communicate()
+ assert "emcc: LLVM opts: ['-O3']" not in err
+ assert ' with -O3 since EMCC_OPTIMIZE_NORMALLY defined' not in err
+ assert ('despite EMCC_OPTIMIZE_NORMALLY since not source code' in err) == optimize_normally
+
+ out, err = Popen([PYTHON, EMCC, self.in_dir('main.cpp'), self.in_dir('supp.cpp'), '-O2', '-o', 'both2.o'], stdout=PIPE, stderr=PIPE).communicate()
+ assert ("emcc: LLVM opts: ['-O3']" in err) == optimize_normally
+ assert (' with -O3 since EMCC_OPTIMIZE_NORMALLY defined' in err) == optimize_normally
+
+ for last in ['both.o', 'both2.o']:
+ out, err = Popen([PYTHON, EMCC, self.in_dir('both.o'), '-O2', '-o', last + '.js'], stdout=PIPE, stderr=PIPE).communicate()
+ assert ("emcc: LLVM opts: ['-O3']" not in err) == optimize_normally
+ assert ' with -O3 since EMCC_OPTIMIZE_NORMALLY defined' not in err
+ output = run_js(last + '.js')
+ assert 'yello' in output, 'code works'
+ assert open('both.o.js').read() == open('both2.o.js').read()
+
+ finally:
+ if optimize_normally: del os.environ['EMCC_OPTIMIZE_NORMALLY']
+ del os.environ['EMCC_DEBUG']
+
def test_conftest_s_flag_passing(self):
open(os.path.join(self.get_dir(), 'conftest.c'), 'w').write(r'''
int main() {
@@ -10030,6 +10336,12 @@ elif 'browser' in str(sys.argv):
Popen([PYTHON, EMCC, os.path.join(self.get_dir(), 'sdl_image.c'), '-O2', '--preload-file', 'screenshot.jpg', '-o', 'page.html']).communicate()
self.run_browser('page.html', '', '/report_result?600')
+ def test_sdl_image_jpeg(self):
+ shutil.copyfile(path_from_root('tests', 'screenshot.jpg'), os.path.join(self.get_dir(), 'screenshot.jpeg'))
+ open(os.path.join(self.get_dir(), 'sdl_image_jpeg.c'), 'w').write(self.with_report_result(open(path_from_root('tests', 'sdl_image_jpeg.c')).read()))
+ Popen([PYTHON, EMCC, os.path.join(self.get_dir(), 'sdl_image_jpeg.c'), '--preload-file', 'screenshot.jpeg', '-o', 'page.html']).communicate()
+ self.run_browser('page.html', '', '/report_result?600')
+
def test_sdl_image_compressed(self):
for image, width in [(path_from_root('tests', 'screenshot2.png'), 300),
(path_from_root('tests', 'screenshot.jpg'), 600)]:
@@ -10049,12 +10361,12 @@ elif 'browser' in str(sys.argv):
self.run_browser('page.html', '', '/report_result?' + str(width))
def test_sdl_image_prepare(self):
- # load an image file, get pixel data. Also O2 coverage for --preload-file
+ # load an image file, get pixel data.
shutil.copyfile(path_from_root('tests', 'screenshot.jpg'), os.path.join(self.get_dir(), 'screenshot.not'))
self.btest('sdl_image_prepare.c', reference='screenshot.jpg', args=['--preload-file', 'screenshot.not'])
def test_sdl_image_prepare_data(self):
- # load an image file, get pixel data. Also O2 coverage for --preload-file
+ # load an image file, get pixel data.
shutil.copyfile(path_from_root('tests', 'screenshot.jpg'), os.path.join(self.get_dir(), 'screenshot.not'))
self.btest('sdl_image_prepare_data.c', reference='screenshot.jpg', args=['--preload-file', 'screenshot.not'])
@@ -10092,6 +10404,28 @@ elif 'browser' in str(sys.argv):
Popen([PYTHON, EMCC, os.path.join(self.get_dir(), 'sdl_key.c'), '-o', 'page.html', '--pre-js', 'pre.js', '-s', '''EXPORTED_FUNCTIONS=['_main', '_one']''']).communicate()
self.run_browser('page.html', '', '/report_result?510510')
+ def test_sdl_text(self):
+ open(os.path.join(self.get_dir(), 'pre.js'), 'w').write('''
+ Module.postRun = function() {
+ function doOne() {
+ Module._one();
+ setTimeout(doOne, 1000/60);
+ }
+ setTimeout(doOne, 1000/60);
+ }
+
+ function simulateKeyEvent(charCode) {
+ var event = document.createEvent("KeyboardEvent");
+ event.initKeyEvent("keypress", true, true, window,
+ 0, 0, 0, 0, 0, charCode);
+ document.body.dispatchEvent(event);
+ }
+ ''')
+ open(os.path.join(self.get_dir(), 'sdl_text.c'), 'w').write(self.with_report_result(open(path_from_root('tests', 'sdl_text.c')).read()))
+
+ Popen([PYTHON, EMCC, os.path.join(self.get_dir(), 'sdl_text.c'), '-o', 'page.html', '--pre-js', 'pre.js', '-s', '''EXPORTED_FUNCTIONS=['_main', '_one']''']).communicate()
+ self.run_browser('page.html', '', '/report_result?1')
+
def test_sdl_mouse(self):
open(os.path.join(self.get_dir(), 'pre.js'), 'w').write('''
function simulateMouseEvent(x, y, button) {
@@ -10152,56 +10486,56 @@ elif 'browser' in str(sys.argv):
# SDL, OpenGL, textures, immediate mode. Closure for more coverage
shutil.copyfile(path_from_root('tests', 'screenshot.png'), os.path.join(self.get_dir(), 'screenshot.png'))
self.reftest(path_from_root('tests', 'screenshot-gray-purple.png'))
- Popen([PYTHON, EMCC, path_from_root('tests', 'sdl_ogl.c'), '-O2', '--minify', '0', '-o', 'something.html', '--pre-js', 'reftest.js', '--preload-file', 'screenshot.png']).communicate()
+ Popen([PYTHON, EMCC, path_from_root('tests', 'sdl_ogl.c'), '-O2', '--minify', '0', '-o', 'something.html', '--pre-js', 'reftest.js', '--preload-file', 'screenshot.png', '-s', 'GL_TESTING=1']).communicate()
self.run_browser('something.html', 'You should see an image with gray at the top.', '/report_result?0')
def test_sdl_ogl_defaultmatrixmode(self):
# SDL, OpenGL, textures, immediate mode. Closure for more coverage
shutil.copyfile(path_from_root('tests', 'screenshot.png'), os.path.join(self.get_dir(), 'screenshot.png'))
self.reftest(path_from_root('tests', 'screenshot-gray-purple.png'))
- Popen([PYTHON, EMCC, path_from_root('tests', 'sdl_ogl_defaultMatrixMode.c'), '--minify', '0', '-o', 'something.html', '--pre-js', 'reftest.js', '--preload-file', 'screenshot.png']).communicate()
+ Popen([PYTHON, EMCC, path_from_root('tests', 'sdl_ogl_defaultMatrixMode.c'), '--minify', '0', '-o', 'something.html', '--pre-js', 'reftest.js', '--preload-file', 'screenshot.png', '-s', 'GL_TESTING=1']).communicate()
self.run_browser('something.html', 'You should see an image with gray at the top.', '/report_result?0')
def test_sdl_ogl_p(self):
# Immediate mode with pointers
shutil.copyfile(path_from_root('tests', 'screenshot.png'), os.path.join(self.get_dir(), 'screenshot.png'))
self.reftest(path_from_root('tests', 'screenshot-gray.png'))
- Popen([PYTHON, EMCC, path_from_root('tests', 'sdl_ogl_p.c'), '-o', 'something.html', '--pre-js', 'reftest.js', '--preload-file', 'screenshot.png']).communicate()
+ Popen([PYTHON, EMCC, path_from_root('tests', 'sdl_ogl_p.c'), '-o', 'something.html', '--pre-js', 'reftest.js', '--preload-file', 'screenshot.png', '-s', 'GL_TESTING=1']).communicate()
self.run_browser('something.html', 'You should see an image with gray at the top.', '/report_result?0')
def test_sdl_fog_simple(self):
# SDL, OpenGL, textures, fog, immediate mode. Closure for more coverage
shutil.copyfile(path_from_root('tests', 'screenshot.png'), os.path.join(self.get_dir(), 'screenshot.png'))
self.reftest(path_from_root('tests', 'screenshot-fog-simple.png'))
- Popen([PYTHON, EMCC, path_from_root('tests', 'sdl_fog_simple.c'), '-O2', '--minify', '0', '-o', 'something.html', '--pre-js', 'reftest.js', '--preload-file', 'screenshot.png']).communicate()
+ Popen([PYTHON, EMCC, path_from_root('tests', 'sdl_fog_simple.c'), '-O2', '--minify', '0', '-o', 'something.html', '--pre-js', 'reftest.js', '--preload-file', 'screenshot.png', '-s', 'GL_TESTING=1']).communicate()
self.run_browser('something.html', 'You should see an image with fog.', '/report_result?0')
def test_sdl_fog_negative(self):
# SDL, OpenGL, textures, fog, immediate mode. Closure for more coverage
shutil.copyfile(path_from_root('tests', 'screenshot.png'), os.path.join(self.get_dir(), 'screenshot.png'))
self.reftest(path_from_root('tests', 'screenshot-fog-negative.png'))
- Popen([PYTHON, EMCC, path_from_root('tests', 'sdl_fog_negative.c'), '-o', 'something.html', '--pre-js', 'reftest.js', '--preload-file', 'screenshot.png']).communicate()
+ Popen([PYTHON, EMCC, path_from_root('tests', 'sdl_fog_negative.c'), '-o', 'something.html', '--pre-js', 'reftest.js', '--preload-file', 'screenshot.png', '-s', 'GL_TESTING=1']).communicate()
self.run_browser('something.html', 'You should see an image with fog.', '/report_result?0')
def test_sdl_fog_density(self):
# SDL, OpenGL, textures, fog, immediate mode. Closure for more coverage
shutil.copyfile(path_from_root('tests', 'screenshot.png'), os.path.join(self.get_dir(), 'screenshot.png'))
self.reftest(path_from_root('tests', 'screenshot-fog-density.png'))
- Popen([PYTHON, EMCC, path_from_root('tests', 'sdl_fog_density.c'), '-o', 'something.html', '--pre-js', 'reftest.js', '--preload-file', 'screenshot.png']).communicate()
+ Popen([PYTHON, EMCC, path_from_root('tests', 'sdl_fog_density.c'), '-o', 'something.html', '--pre-js', 'reftest.js', '--preload-file', 'screenshot.png', '-s', 'GL_TESTING=1']).communicate()
self.run_browser('something.html', 'You should see an image with fog.', '/report_result?0')
def test_sdl_fog_exp2(self):
# SDL, OpenGL, textures, fog, immediate mode. Closure for more coverage
shutil.copyfile(path_from_root('tests', 'screenshot.png'), os.path.join(self.get_dir(), 'screenshot.png'))
self.reftest(path_from_root('tests', 'screenshot-fog-exp2.png'))
- Popen([PYTHON, EMCC, path_from_root('tests', 'sdl_fog_exp2.c'), '-o', 'something.html', '--pre-js', 'reftest.js', '--preload-file', 'screenshot.png']).communicate()
+ Popen([PYTHON, EMCC, path_from_root('tests', 'sdl_fog_exp2.c'), '-o', 'something.html', '--pre-js', 'reftest.js', '--preload-file', 'screenshot.png', '-s', 'GL_TESTING=1']).communicate()
self.run_browser('something.html', 'You should see an image with fog.', '/report_result?0')
def test_sdl_fog_linear(self):
# SDL, OpenGL, textures, fog, immediate mode. Closure for more coverage
shutil.copyfile(path_from_root('tests', 'screenshot.png'), os.path.join(self.get_dir(), 'screenshot.png'))
self.reftest(path_from_root('tests', 'screenshot-fog-linear.png'))
- Popen([PYTHON, EMCC, path_from_root('tests', 'sdl_fog_linear.c'), '-o', 'something.html', '--pre-js', 'reftest.js', '--preload-file', 'screenshot.png']).communicate()
+ Popen([PYTHON, EMCC, path_from_root('tests', 'sdl_fog_linear.c'), '-o', 'something.html', '--pre-js', 'reftest.js', '--preload-file', 'screenshot.png', '-s', 'GL_TESTING=1']).communicate()
self.run_browser('something.html', 'You should see an image with fog.', '/report_result?0')
def test_worker(self):
@@ -10300,7 +10634,6 @@ elif 'browser' in str(sys.argv):
def chunked_server(support_byte_ranges):
class ChunkedServerHandler(BaseHTTPServer.BaseHTTPRequestHandler):
- @staticmethod
def sendheaders(s, extra=[], length=len(data)):
s.send_response(200)
s.send_header("Content-Length", str(length))
@@ -10314,11 +10647,14 @@ elif 'browser' in str(sys.argv):
s.end_headers()
def do_HEAD(s):
- ChunkedServerHandler.sendheaders(s)
-
+ s.sendheaders()
+
+ def do_OPTIONS(s):
+ s.sendheaders([("Access-Control-Allow-Headers", "Range")], 0)
+
def do_GET(s):
if not support_byte_ranges:
- ChunkedServerHandler.sendheaders(s)
+ s.sendheaders()
s.wfile.write(data)
else:
(start, end) = s.headers.get("range").split("=")[1].split("-")
@@ -10326,7 +10662,7 @@ elif 'browser' in str(sys.argv):
end = int(end)
end = min(len(data)-1, end)
length = end-start+1
- ChunkedServerHandler.sendheaders(s,[],length)
+ s.sendheaders([],length)
s.wfile.write(data[start:end+1])
s.wfile.close()
httpd = BaseHTTPServer.HTTPServer(('localhost', 11111), ChunkedServerHandler)
@@ -10341,26 +10677,30 @@ elif 'browser' in str(sys.argv):
def test_glgears(self):
self.reftest(path_from_root('tests', 'gears.png'))
Popen([PYTHON, EMCC, path_from_root('tests', 'hello_world_gles.c'), '-o', 'something.html',
- '-DHAVE_BUILTIN_SINCOS', '--pre-js', 'reftest.js']).communicate()
+ '-DHAVE_BUILTIN_SINCOS', '--pre-js', 'reftest.js', '-s', 'GL_TESTING=1']).communicate()
self.run_browser('something.html', 'You should see animating gears.', '/report_result?0')
def test_glgears_animation(self):
- Popen([PYTHON, EMCC, path_from_root('tests', 'hello_world_gles.c'), '-o', 'something.html',
- '-DHAVE_BUILTIN_SINCOS',
- '--shell-file', path_from_root('tests', 'hello_world_gles_shell.html')]).communicate()
- self.run_browser('something.html', 'You should see animating gears.', '/report_gl_result?true')
+ for emulation in [0, 1]:
+ print emulation
+ Popen([PYTHON, EMCC, path_from_root('tests', 'hello_world_gles.c'), '-o', 'something.html',
+ '-DHAVE_BUILTIN_SINCOS', '-s', 'GL_TESTING=1',
+ '--shell-file', path_from_root('tests', 'hello_world_gles_shell.html')] +
+ (['-s', 'FORCE_GL_EMULATION=1'] if emulation else [])).communicate()
+ self.run_browser('something.html', 'You should see animating gears.', '/report_gl_result?true')
+ assert ('var GLEmulation' in open(self.in_dir('something.html')).read()) == emulation, "emulation code should be added when asked for"
def test_glgears_bad(self):
# Make sure that OpenGL ES is not available if typed arrays are not used
Popen([PYTHON, EMCC, path_from_root('tests', 'hello_world_gles.c'), '-o', 'something.html',
- '-DHAVE_BUILTIN_SINCOS',
+ '-DHAVE_BUILTIN_SINCOS', '-s', 'GL_TESTING=1',
'-s', 'USE_TYPED_ARRAYS=0',
'--shell-file', path_from_root('tests', 'hello_world_gles_shell.html')]).communicate()
self.run_browser('something.html', 'You should not see animating gears.', '/report_gl_result?false')
def test_glgears_deriv(self):
self.reftest(path_from_root('tests', 'gears.png'))
- Popen([PYTHON, EMCC, path_from_root('tests', 'hello_world_gles_deriv.c'), '-o', 'something.html',
+ Popen([PYTHON, EMCC, path_from_root('tests', 'hello_world_gles_deriv.c'), '-o', 'something.html', '-s', 'GL_TESTING=1',
'-DHAVE_BUILTIN_SINCOS', '--pre-js', 'reftest.js']).communicate()
self.run_browser('something.html', 'You should see animating gears.', '/report_result?0')
src = open('something.html').read()
@@ -10391,7 +10731,7 @@ elif 'browser' in str(sys.argv):
args = ['--preload-file', 'smoke.tga', '-O2'] # test optimizations and closure here as well for more coverage
self.reftest(book_path(basename.replace('.bc', '.png')))
- Popen([PYTHON, EMCC, program, '-o', 'program.html', '--pre-js', 'reftest.js'] + args).communicate()
+ Popen([PYTHON, EMCC, program, '-o', 'program.html', '--pre-js', 'reftest.js', '-s', 'GL_TESTING=1'] + args).communicate()
self.run_browser('program.html', '', '/report_result?0')
def btest(self, filename, expected=None, reference=None, reference_slack=0, args=[]): # TODO: use in all other tests
@@ -10404,13 +10744,38 @@ elif 'browser' in str(sys.argv):
open(os.path.join(self.get_dir(), filename), 'w').write(self.with_report_result(src))
else:
expected = [str(i) for i in range(0, reference_slack+1)]
- shutil.copyfile(path_from_root('tests', filename), os.path.join(self.get_dir(), filename))
+ shutil.copyfile(path_from_root('tests', filename), os.path.join(self.get_dir(), os.path.basename(filename)))
self.reftest(path_from_root('tests', reference))
- args = args + ['--pre-js', 'reftest.js']
- Popen([PYTHON, EMCC, os.path.join(self.get_dir(), filename), '-o', 'test.html'] + args).communicate()
+ args = args + ['--pre-js', 'reftest.js', '-s', 'GL_TESTING=1']
+ Popen([PYTHON, EMCC, os.path.join(self.get_dir(), os.path.basename(filename)), '-o', 'test.html'] + args).communicate()
if type(expected) is str: expected = [expected]
self.run_browser('test.html', '.', ['/report_result?' + e for e in expected])
+ def test_gles2_emulation(self):
+ shutil.copyfile(path_from_root('tests', 'glbook', 'Chapter_10', 'MultiTexture', 'basemap.tga'), self.in_dir('basemap.tga'))
+ shutil.copyfile(path_from_root('tests', 'glbook', 'Chapter_10', 'MultiTexture', 'lightmap.tga'), self.in_dir('lightmap.tga'))
+ shutil.copyfile(path_from_root('tests', 'glbook', 'Chapter_13', 'ParticleSystem', 'smoke.tga'), self.in_dir('smoke.tga'))
+
+ for source, reference in [
+ (os.path.join('glbook', 'Chapter_2', 'Hello_Triangle', 'Hello_Triangle_orig.c'), path_from_root('tests', 'glbook', 'CH02_HelloTriangle.png')),
+ #(os.path.join('glbook', 'Chapter_8', 'Simple_VertexShader', 'Simple_VertexShader_orig.c'), path_from_root('tests', 'glbook', 'CH08_SimpleVertexShader.png')), # XXX needs INT extension in WebGL
+ (os.path.join('glbook', 'Chapter_9', 'TextureWrap', 'TextureWrap_orig.c'), path_from_root('tests', 'glbook', 'CH09_TextureWrap.png')),
+ #(os.path.join('glbook', 'Chapter_9', 'Simple_TextureCubemap', 'Simple_TextureCubemap_orig.c'), path_from_root('tests', 'glbook', 'CH09_TextureCubemap.png')), # XXX needs INT extension in WebGL
+ (os.path.join('glbook', 'Chapter_9', 'Simple_Texture2D', 'Simple_Texture2D_orig.c'), path_from_root('tests', 'glbook', 'CH09_SimpleTexture2D.png')),
+ (os.path.join('glbook', 'Chapter_10', 'MultiTexture', 'MultiTexture_orig.c'), path_from_root('tests', 'glbook', 'CH10_MultiTexture.png')),
+ (os.path.join('glbook', 'Chapter_13', 'ParticleSystem', 'ParticleSystem_orig.c'), path_from_root('tests', 'glbook', 'CH13_ParticleSystem.png')),
+ ]:
+ print source
+ self.btest(source,
+ reference=reference,
+ args=['-I' + path_from_root('tests', 'glbook', 'Common'),
+ path_from_root('tests', 'glbook', 'Common', 'esUtil.c'),
+ path_from_root('tests', 'glbook', 'Common', 'esShader.c'),
+ path_from_root('tests', 'glbook', 'Common', 'esShapes.c'),
+ path_from_root('tests', 'glbook', 'Common', 'esTransform.c'),
+ '-s', 'FULL_ES2=1',
+ '--preload-file', 'basemap.tga', '--preload-file', 'lightmap.tga', '--preload-file', 'smoke.tga'])
+
def test_emscripten_api(self):
self.btest('emscripten_api_browser.cpp', '1', args=['-s', '''EXPORTED_FUNCTIONS=['_main', '_third']'''])
@@ -10447,10 +10812,13 @@ elif 'browser' in str(sys.argv):
self.btest('gl_ps_packed.c', reference='gl_ps.png', args=['--preload-file', 'screenshot.png'])
def test_gl_ps_workaround(self):
- # packed data that needs to be strided
shutil.copyfile(path_from_root('tests', 'screenshot.png'), os.path.join(self.get_dir(), 'screenshot.png'))
self.btest('gl_ps_workaround.c', reference='gl_ps.png', args=['--preload-file', 'screenshot.png'])
+ def test_gl_ps_workaround2(self):
+ shutil.copyfile(path_from_root('tests', 'screenshot.png'), os.path.join(self.get_dir(), 'screenshot.png'))
+ self.btest('gl_ps_workaround2.c', reference='gl_ps.png', args=['--preload-file', 'screenshot.png'])
+
def test_matrix_identity(self):
self.btest('gl_matrix_identity.c', expected=['-1882984448', '460451840'])
@@ -10499,6 +10867,15 @@ elif 'browser' in str(sys.argv):
def test_cubegeom_fog(self):
self.btest('cubegeom_fog.c', expected=['1617140399', '-898782526', '-946179526'])
+ def test_cubegeom_pre_vao(self):
+ self.btest('cubegeom_pre_vao.c', expected=['-1472804742', '-1626058463', '-2046234971'])
+
+ def test_cubegeom_pre2_vao(self):
+ self.btest('cubegeom_pre2_vao.c', expected=['-1472804742', '-1626058463', '-2046234971'])
+
+ def test_cubegeom_pre2_vao2(self):
+ self.btest('cubegeom_pre2_vao2.c', expected=['-790445118'])
+
def test_cube_explosion(self):
self.btest('cube_explosion.c', expected=['667220544', '-1543354600', '-1485258415'])
@@ -10588,10 +10965,10 @@ elif 'browser' in str(sys.argv):
main, supp = self.setup_runtimelink_test()
open(self.in_dir('supp.cpp'), 'w').write(supp)
- Popen([PYTHON, EMCC, self.in_dir('supp.cpp'), '-o', 'supp.js', '-s', 'LINKABLE=1', '-s', 'NAMED_GLOBALS=1', '-s', 'BUILD_AS_SHARED_LIB=2', '-O2', '--closure', '0']).communicate()
+ Popen([PYTHON, EMCC, self.in_dir('supp.cpp'), '-o', 'supp.js', '-s', 'LINKABLE=1', '-s', 'NAMED_GLOBALS=1', '-s', 'BUILD_AS_SHARED_LIB=2', '-O2']).communicate()
shutil.move(self.in_dir('supp.js'), self.in_dir('supp.so'))
- self.btest(main, args=['-s', 'LINKABLE=1', '-s', 'NAMED_GLOBALS=1', '-s', 'RUNTIME_LINKED_LIBS=["supp.so"]', '-DBROWSER=1', '-O2', '--closure', '0'], expected='76')
+ self.btest(main, args=['-s', 'LINKABLE=1', '-s', 'NAMED_GLOBALS=1', '-s', 'RUNTIME_LINKED_LIBS=["supp.so"]', '-DBROWSER=1', '-O2'], expected='76')
def test_pre_run_deps(self):
# Adding a dependency in preRun will delay run
@@ -10893,6 +11270,9 @@ elif 'benchmark' in str(sys.argv):
'-o', final_filename] + shared_args + emcc_args, stdout=PIPE, stderr=self.stderr_redirect).communicate()
assert os.path.exists(final_filename), 'Failed to compile file: ' + output[0]
+ if self.save_JS:
+ self.hardcode_arguments(final_filename, args)
+
# Run JS
global total_times, tests_done
times = []
@@ -11145,7 +11525,7 @@ elif 'benchmark' in str(sys.argv):
def test_dlmalloc(self):
# XXX This seems to have regressed slightly with emcc. Are -g and the signs lines passed properly?
src = open(path_from_root('system', 'lib', 'dlmalloc.c'), 'r').read() + '\n\n\n' + open(path_from_root('tests', 'dlmalloc_test.c'), 'r').read()
- self.do_benchmark('dlmalloc', src, ['400', '3000'], '*3000,0*', emcc_args=['-g', '-s', 'CORRECT_SIGNS=2', '-s', 'CORRECT_SIGNS_LINES=[4820, 4195, 4250, 4203, 4209, 4239, 4231]'])
+ self.do_benchmark('dlmalloc', src, ['400', '3000'], '*3000,0*')
def test_zlib(self):
src = open(path_from_root('tests', 'zlib', 'benchmark.c'), 'r').read()
@@ -11305,12 +11685,12 @@ elif 'sanity' in str(sys.argv):
f = open(CONFIG_FILE, 'a')
f.write('CLOSURE_COMPILER = "/tmp/nowhere/nothingtoseehere/kjadsfkjwelkjsdfkqgas/nonexistent.txt"\n')
f.close()
- output = self.check_working([EMCC, '-O2', 'tests/hello_world.cpp'], CLOSURE_FATAL)
+ output = self.check_working([EMCC, '-O2', '--closure', '1', 'tests/hello_world.cpp'], CLOSURE_FATAL)
# With a working path, all is well
restore()
try_delete('a.out.js')
- output = self.check_working([EMCC, '-O2', 'tests/hello_world.cpp'], '')
+ output = self.check_working([EMCC, '-O2', '--closure', '1', 'tests/hello_world.cpp'], '')
assert os.path.exists('a.out.js')
def test_llvm(self):
@@ -11512,7 +11892,7 @@ fi
try_delete(basebc_name) # we might need to check this file later
try_delete(dcebc_name) # we might need to check this file later
for ll_name in ll_names: try_delete(ll_name)
- output = self.do([EMCC, '-O' + str(i), '--closure', '0', '-s', 'RELOOP=0', '--llvm-lto', '0', path_from_root('tests', filename)])
+ output = self.do([EMCC, '-O' + str(i), '-s', 'RELOOP=0', '--llvm-lto', '0', path_from_root('tests', filename)])
#print output
assert INCLUDING_MESSAGE.replace('X', libname) in output
if libname == 'libc':
@@ -11560,7 +11940,7 @@ fi
print >> sys.stderr, phase, i
opt = min(i, 2)
try_delete('a.out.js')
- output = Popen([PYTHON, EMCC, path_from_root('tests', 'hello_world_loop.cpp'), '-O' + str(opt), '--closure', '0'],
+ output = Popen([PYTHON, EMCC, path_from_root('tests', 'hello_world_loop.cpp'), '-O' + str(opt)],
stdout=PIPE, stderr=PIPE).communicate()
self.assertContained('hello, world!', run_js('a.out.js'))
output = '\n'.join(output)
@@ -11584,6 +11964,8 @@ fi
try:
os.environ['EMCC_DEBUG'] = '1'
+ os.environ['EMCC_JSOPT_MIN_CHUNK_SIZE'] = str(1024*512)
+
self.working_dir = os.path.join(TEMP_DIR, 'emscripten_temp')
if not os.path.exists(self.working_dir): os.makedirs(self.working_dir)
@@ -11610,17 +11992,17 @@ fi
(['--jcache'], 'hello_malloc.cpp', False, True, False, True, False, True, []),
([], 'hello_malloc.cpp', False, False, False, False, False, False, []),
# new, huge file
- ([], 'hello_libcxx.cpp', False, False, False, False, False, False, ('2 chunks', '3 chunks')),
+ ([], 'hello_libcxx.cpp', False, False, False, False, False, False, ('3 chunks',)),
(['--jcache'], 'hello_libcxx.cpp', True, False, True, False, True, False, []),
(['--jcache'], 'hello_libcxx.cpp', False, True, False, True, False, True, []),
([], 'hello_libcxx.cpp', False, False, False, False, False, False, []),
# finally, build a file close to the previous, to see that some chunks are found in the cache and some not
- (['--jcache'], 'hello_libcxx_mod1.cpp', False, True, True, True, True, False, []), # win on pre, mix on funcs, lose on jsfuncs
+ (['--jcache'], 'hello_libcxx_mod1.cpp', False, True, True, True, True, True, []), # win on pre, mix on funcs, mix on jsfuncs
(['--jcache'], 'hello_libcxx_mod1.cpp', False, True, False, True, False, True, []),
]:
print >> sys.stderr, args, input_file, expect_pre_save, expect_pre_load, expect_funcs_save, expect_funcs_load, expect_jsfuncs_save, expect_jsfuncs_load, expected
self.clear()
- out, err = Popen([PYTHON, EMCC, '-O2', '--closure', '0', path_from_root('tests', input_file)] + args, stdout=PIPE, stderr=PIPE).communicate()
+ out, err = Popen([PYTHON, EMCC, '-O2', path_from_root('tests', input_file)] + args, stdout=PIPE, stderr=PIPE).communicate()
errtail = err.split('emcc invocation')[-1]
self.assertContained('hello, world!', run_js('a.out.js'), errtail)
assert (PRE_SAVE_MSG in err) == expect_pre_save, errtail
@@ -11634,8 +12016,8 @@ fi
if input_file not in srcs:
srcs[input_file] = curr
else:
- open('/home/alon/Dev/emscripten/a', 'w').write(srcs[input_file])
- open('/home/alon/Dev/emscripten/b', 'w').write(curr)
+ #open('/home/alon/Dev/emscripten/a', 'w').write(srcs[input_file])
+ #open('/home/alon/Dev/emscripten/b', 'w').write(curr)
assert abs(len(curr)/float(len(srcs[input_file]))-1)<0.01, 'contents may shift in order, but must remain the same size %d vs %d' % (len(curr), len(srcs[input_file])) + '\n' + errtail
used_jcache = used_jcache or ('--jcache' in args)
assert used_jcache == os.path.exists(JCache.get_cachename('emscript_files'))
@@ -11643,6 +12025,7 @@ fi
finally:
del os.environ['EMCC_DEBUG']
+ del os.environ['EMCC_JSOPT_MIN_CHUNK_SIZE']
else:
raise Exception('Test runner is confused: ' + str(sys.argv))
diff --git a/tests/s3tc_crunch.png b/tests/s3tc_crunch.png
index 3510b83b..067be7aa 100644
--- a/tests/s3tc_crunch.png
+++ b/tests/s3tc_crunch.png
Binary files differ
diff --git a/tests/screenshot-fog-density.png b/tests/screenshot-fog-density.png
index cd1f6f1b..60f0c9ef 100644
--- a/tests/screenshot-fog-density.png
+++ b/tests/screenshot-fog-density.png
Binary files differ
diff --git a/tests/screenshot-fog-exp2.png b/tests/screenshot-fog-exp2.png
index cd5e6a63..4737a536 100644
--- a/tests/screenshot-fog-exp2.png
+++ b/tests/screenshot-fog-exp2.png
Binary files differ
diff --git a/tests/screenshot-fog-linear.png b/tests/screenshot-fog-linear.png
index 57534566..747c0c25 100644
--- a/tests/screenshot-fog-linear.png
+++ b/tests/screenshot-fog-linear.png
Binary files differ
diff --git a/tests/screenshot-fog-negative.png b/tests/screenshot-fog-negative.png
index 5b18a201..747063c9 100644
--- a/tests/screenshot-fog-negative.png
+++ b/tests/screenshot-fog-negative.png
Binary files differ
diff --git a/tests/screenshot-fog-simple.png b/tests/screenshot-fog-simple.png
index 527768fc..7624076c 100644
--- a/tests/screenshot-fog-simple.png
+++ b/tests/screenshot-fog-simple.png
Binary files differ
diff --git a/tests/screenshot-gray-purple.png b/tests/screenshot-gray-purple.png
index 514b29a1..eaf08e6a 100644
--- a/tests/screenshot-gray-purple.png
+++ b/tests/screenshot-gray-purple.png
Binary files differ
diff --git a/tests/screenshot-gray.png b/tests/screenshot-gray.png
index 16e45a7a..af06c256 100644
--- a/tests/screenshot-gray.png
+++ b/tests/screenshot-gray.png
Binary files differ
diff --git a/tests/sdl_gl_read.c b/tests/sdl_gl_read.c
index 552eb8c0..d752f94d 100644
--- a/tests/sdl_gl_read.c
+++ b/tests/sdl_gl_read.c
@@ -6,6 +6,7 @@
#include <stdio.h>
#include <stdlib.h>
+#include <assert.h>
GLuint programObject;
int width = 512;
@@ -118,8 +119,14 @@ void Draw ()
}
void Verify() {
- unsigned char *data = malloc(width*height*4);
+ unsigned char *data = malloc(width*height*4 + 16);
+ int *last = (int*)(data + width*height*4 - 4);
+ int *after = (int*)(data + width*height*4);
+ *last = 0xdeadbeef;
+ *after = 0x12345678;
glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, data);
+ assert(*last != 0xdeadbeef); // should overwrite the buffer to the end
+ assert(*after == 0x12345678); // nothing should be written afterwards!
// Should see some blue, and nothing else
int seen = 0;
int ok = 1;
diff --git a/tests/sdl_image_jpeg.c b/tests/sdl_image_jpeg.c
new file mode 100644
index 00000000..10619dad
--- /dev/null
+++ b/tests/sdl_image_jpeg.c
@@ -0,0 +1,45 @@
+#include <stdio.h>
+#include <SDL/SDL.h>
+#include <SDL/SDL_image.h>
+#include <assert.h>
+#include <emscripten.h>
+
+int testImage(SDL_Surface* screen, const char* fileName) {
+ SDL_Surface *image = IMG_Load(fileName);
+ if (!image)
+ {
+ printf("IMG_Load: %s\n", IMG_GetError());
+ return 0;
+ }
+ assert(image->format->BitsPerPixel == 32);
+ assert(image->format->BytesPerPixel == 4);
+ assert(image->pitch == 4*image->w);
+ int result = image->w;
+
+ SDL_BlitSurface (image, NULL, screen, NULL);
+ SDL_FreeSurface (image);
+
+ return result;
+}
+
+int main() {
+ SDL_Init(SDL_INIT_VIDEO);
+ SDL_Surface *screen = SDL_SetVideoMode(600, 450, 32, SDL_SWSURFACE);
+
+ int result = 0;
+ result = testImage(screen, "screenshot.jpeg"); // relative path
+ assert(result != 0);
+ result |= testImage(screen, "/screenshot.jpeg"); // absolute path
+ assert(result != 0);
+
+ SDL_Flip(screen);
+
+ printf("you should see an image.\n");
+
+ SDL_Quit();
+
+ REPORT_RESULT();
+
+ return 0;
+}
+
diff --git a/tests/sdl_text.c b/tests/sdl_text.c
new file mode 100644
index 00000000..6bcb0d61
--- /dev/null
+++ b/tests/sdl_text.c
@@ -0,0 +1,40 @@
+#include <SDL/SDL.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#include <emscripten.h>
+
+int result = 0;
+
+void one() {
+ SDL_Event event;
+ while (SDL_PollEvent(&event)) {
+ switch (event.type) {
+ case SDL_TEXTEDITING: assert(0); break;
+ case SDL_TEXTINPUT:
+ printf("Received %s\n", event.text.text);
+ if (!strcmp("a", event.text.text)) {
+ result = 1;
+ } else if (!strcmp("A", event.text.text)) {
+ REPORT_RESULT();
+ emscripten_run_script("throw 'done'");
+ }
+ break;
+ default: /* Report an unhandled event */
+ printf("I don't know what this event is!\n");
+ }
+ }
+}
+
+int main() {
+ SDL_Init(SDL_INIT_VIDEO);
+ SDL_SetVideoMode(600, 450, 32, SDL_HWSURFACE);
+ SDL_StartTextInput();
+
+ emscripten_run_script("simulateKeyEvent('a'.charCodeAt(0))"); // a
+ emscripten_run_script("simulateKeyEvent('A'.charCodeAt(0))"); // A
+
+ one();
+
+ return 0;
+}
diff --git a/tests/websockets.c b/tests/websockets.c
index 59acbd69..8e719baa 100644
--- a/tests/websockets.c
+++ b/tests/websockets.c
@@ -27,14 +27,19 @@ unsigned int get_all_buf(int sock, char* output, unsigned int maxsize)
assert(select(64, &sett, NULL, NULL, NULL) == 0); // empty set
FD_SET(sock, &sett);
assert(select(0, &sett, NULL, NULL, NULL) == 0); // max FD to check is 0
+ assert(FD_ISSET(sock, &sett) == 0);
+ FD_SET(sock, &sett);
int select_says_yes = select(64, &sett, NULL, NULL, NULL);
// ioctl check for IO
int bytes;
if (ioctl(sock, FIONREAD, &bytes) || bytes == 0) {
not_always_data = 1;
+ assert(FD_ISSET(sock, &sett) == 0);
return 0;
}
+
+ assert(FD_ISSET(sock, &sett));
assert(select_says_yes); // ioctl must agree with select
char buffer[1024];
@@ -82,7 +87,7 @@ void iter(void *arg) {
printf("sum: %d\n", sum);
#if EMSCRIPTEN
- assert(not_always_data == 1);
+ //assert(not_always_data == 1);
int result = sum;
REPORT_RESULT();
diff --git a/tools/autodebugger_c.py b/tools/autodebugger_c.py
index 5d41faf0..54a4d691 100644
--- a/tools/autodebugger_c.py
+++ b/tools/autodebugger_c.py
@@ -21,9 +21,13 @@ for filename in filenames:
if m and (' if ' not in lines[i-1] or '{' in lines[i-1]) and \
(' if ' not in lines[i+1] or '{' in lines[i+1]) and \
(' else' not in lines[i-1] or '{' in lines[i-1]) and \
- (' else' not in lines[i+1] or '{' in lines[i+1]):
- var = m.groups(1)[0].rstrip().split(' ')[-1]
- lines[i] += ''' printf("%s:%d:%s=%%d\\n", %s);''' % (filename, i+1, var, var)
+ (' else' not in lines[i+1] or '{' in lines[i+1]) and \
+ (' for' not in lines[i-1]) and \
+ ('struct' not in lines[i]):
+ raw = m.groups(1)[0].rstrip()
+ var = raw.split(' ')[-1]
+ if ' ' in raw and '[' in var: continue
+ lines[i] += ''' printf("%s:%d:%s=%%d\\n", (int)%s);''' % (filename, i+1, var, var)
f = open(filename, 'w')
f.write('\n'.join(lines))
diff --git a/tools/file_packager.py b/tools/file_packager.py
index 7e196efd..bfa8e2f0 100644
--- a/tools/file_packager.py
+++ b/tools/file_packager.py
@@ -228,7 +228,7 @@ if has_preloaded:
curr = open(file_['localname'], 'rb').read()
file_['data_end'] = start + len(curr)
if AV_WORKAROUND: curr += '\x00'
- print >> sys.stderr, 'bundling', file_['name'], file_['localname'], file_['data_start'], file_['data_end']
+ #print >> sys.stderr, 'bundling', file_['name'], file_['localname'], file_['data_start'], file_['data_end']
start += len(curr)
data.write(curr)
data.close()
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js
index efbfa8aa..f2dc516a 100644
--- a/tools/js-optimizer.js
+++ b/tools/js-optimizer.js
@@ -1598,7 +1598,7 @@ function registerize(ast) {
fun[2].push(reg);
}
}
- getStatements(fun).unshift(['var', vars]);
+ if (vars.length > 0) getStatements(fun).unshift(['var', vars]);
}
} else {
//printErr('unfake params: \n\n' + astToSrc(fun) + '\n\n');
diff --git a/tools/js_optimizer.py b/tools/js_optimizer.py
index f2e610d0..231c6257 100644
--- a/tools/js_optimizer.py
+++ b/tools/js_optimizer.py
@@ -10,7 +10,9 @@ def path_from_root(*pathelems):
JS_OPTIMIZER = path_from_root('tools', 'js-optimizer.js')
-BEST_JS_PROCESS_SIZE = 1024*1024
+NUM_CHUNKS_PER_CORE = 1.5
+MIN_CHUNK_SIZE = int(os.environ.get('EMCC_JSOPT_MIN_CHUNK_SIZE') or 1024*1024) # configuring this is just for debugging purposes
+MAX_CHUNK_SIZE = 20*1024*1024
WINDOWS = sys.platform.startswith('win')
@@ -74,6 +76,8 @@ def run_on_js(filename, passes, js_engine, jcache):
assert gen_end > gen_start
pre = js[:gen_start]
post = js[gen_end:]
+ if 'last' in passes:
+ post = post.replace(suffix, '') # no need to write out the metadata - nothing after us needs it
js = js[gen_start:gen_end]
else:
pre = ''
@@ -88,16 +92,21 @@ def run_on_js(filename, passes, js_engine, jcache):
if i < len(parts)-1: func += '\n}\n' # last part needs no }
m = func_sig.search(func)
if m:
- ident = m.group(1)
+ ident = m.group(2)
else:
if suffix: continue # ignore whitespace
ident = 'anon_%d' % i
+ assert ident
funcs.append((ident, func))
parts = None
total_size = len(js)
js = None
- chunks = shared.JCache.chunkify(funcs, BEST_JS_PROCESS_SIZE, 'jsopt' if jcache else None)
+ cores = int(os.environ.get('EMCC_CORES') or multiprocessing.cpu_count())
+ intended_num_chunks = int(round(cores * NUM_CHUNKS_PER_CORE))
+ chunk_size = min(MAX_CHUNK_SIZE, max(MIN_CHUNK_SIZE, total_size / intended_num_chunks))
+
+ chunks = shared.JCache.chunkify(funcs, chunk_size, 'jsopt' if jcache else None)
if jcache:
# load chunks from cache where we can # TODO: ignore small chunks
@@ -130,18 +139,18 @@ def run_on_js(filename, passes, js_engine, jcache):
if len(filenames) > 0:
# XXX Use '--nocrankshaft' to disable crankshaft to work around v8 bug 1895, needed for older v8/node (node 0.6.8+ should be ok)
- commands = map(lambda filename: [js_engine, JS_OPTIMIZER, filename, 'noPrintMetadata'] + passes, filenames)
+ commands = map(lambda filename: js_engine + [JS_OPTIMIZER, filename, 'noPrintMetadata'] + passes, filenames)
#print [' '.join(command) for command in commands]
- cores = min(multiprocessing.cpu_count(), filenames)
+ cores = min(cores, filenames)
if len(chunks) > 1 and cores >= 2:
# We can parallelize
- if DEBUG: print >> sys.stderr, 'splitting up js optimization into %d chunks, using %d cores (total: %.2f MB)' % (len(chunks), cores, total_size/(1024*1024.))
+ if DEBUG: print >> sys.stderr, 'splitting up js optimization into %d chunks of size %d, using %d cores (total: %.2f MB)' % (len(chunks), chunk_size, cores, total_size/(1024*1024.))
pool = multiprocessing.Pool(processes=cores)
filenames = pool.map(run_on_chunk, commands, chunksize=1)
else:
# We can't parallize, but still break into chunks to avoid uglify/node memory issues
- if len(chunks) > 1 and DEBUG: print >> sys.stderr, 'splitting up js optimization into %d chunks' % (len(chunks))
+ if len(chunks) > 1 and DEBUG: print >> sys.stderr, 'splitting up js optimization into %d chunks of size %d' % (len(chunks), chunk_size)
filenames = [run_on_chunk(command) for command in commands]
else:
filenames = []
diff --git a/tools/shared.py b/tools/shared.py
index 401a580b..aca0677d 100644
--- a/tools/shared.py
+++ b/tools/shared.py
@@ -2,6 +2,10 @@ import shutil, time, os, sys, json, tempfile, copy, shlex, atexit, subprocess, h
from subprocess import Popen, PIPE, STDOUT
from tempfile import mkstemp
+def listify(x):
+ if type(x) is not list: return [x]
+ return x
+
# On Windows python suffers from a particularly nasty bug if python is spawning new processes while python itself is spawned from some other non-console process.
# Use a custom replacement for Popen on Windows to avoid the "WindowsError: [Error 6] The handle is invalid" errors when emcc is driven through cmake or mingw32-make.
# See http://bugs.python.org/issue3905
@@ -28,7 +32,10 @@ class WindowsPopen:
self.stderr_ = PIPE
# Call the process with fixed streams.
- self.process = subprocess.Popen(args, bufsize, executable, self.stdin_, self.stdout_, self.stderr_, preexec_fn, close_fds, shell, cwd, env, universal_newlines, startupinfo, creationflags)
+ try:
+ self.process = subprocess.Popen(args, bufsize, executable, self.stdin_, self.stdout_, self.stderr_, preexec_fn, close_fds, shell, cwd, env, universal_newlines, startupinfo, creationflags)
+ except Exception, e:
+ print >> sys.stderr, 'subprocess.Popen(args=%s) failed! Exception %s' % (' '.join(args), str(e))
def communicate(self, input=None):
output = self.process.communicate(input)
@@ -155,7 +162,8 @@ EXPECTED_NODE_VERSION = (0,6,8)
def check_node_version():
try:
- actual = Popen([NODE_JS, '--version'], stdout=PIPE).communicate()[0].strip()
+ node = listify(NODE_JS)
+ actual = Popen(node + ['--version'], stdout=PIPE).communicate()[0].strip()
version = tuple(map(int, actual.replace('v', '').split('.')))
if version >= EXPECTED_NODE_VERSION:
return True
@@ -295,6 +303,10 @@ CANONICAL_TEMP_DIR = os.path.join(TEMP_DIR, 'emscripten_temp')
EMSCRIPTEN_TEMP_DIR = None
DEBUG = os.environ.get('EMCC_DEBUG')
+if DEBUG == "0":
+ DEBUG = None
+DEBUG_CACHE = DEBUG and "cache" in DEBUG
+
if DEBUG:
try:
EMSCRIPTEN_TEMP_DIR = CANONICAL_TEMP_DIR
@@ -376,6 +388,9 @@ if USE_EMSDK:
else:
EMSDK_OPTS = []
+#print >> sys.stderr, 'SDK opts', ' '.join(EMSDK_OPTS)
+#print >> sys.stderr, 'Compiler opts', ' '.join(COMPILER_OPTS)
+
# Engine tweaks
try:
@@ -461,7 +476,8 @@ def timeout_run(proc, timeout, note='unnamed process', full_output=False):
def run_js(filename, engine=None, args=[], check_timeout=False, stdout=PIPE, stderr=None, cwd=None, full_output=False):
if engine is None: engine = JS_ENGINES[0]
- if type(engine) is not list: engine = [engine]
+ engine = listify(engine)
+ #if not WINDOWS: 'd8' in engine[0] or 'node' in engine[0]: engine += ['--stack_size=8192'] # needed for some big projects
command = engine + [filename] + (['--'] if 'd8' in engine[0] else []) + args
return timeout_run(Popen(command, stdout=stdout, stderr=stderr, cwd=cwd), 15*60 if check_timeout else None, 'Execution', full_output=full_output)
@@ -554,7 +570,7 @@ class Settings:
ret = []
for key, value in Settings.__dict__.iteritems():
if key == key.upper(): # this is a hack. all of our settings are ALL_CAPS, python internals are not
- jsoned = json.dumps(value)
+ jsoned = json.dumps(value, sort_keys=True)
ret += ['-s', key + '=' + jsoned]
return ret
@@ -563,10 +579,11 @@ class Settings:
if opt_level >= 1:
Settings.ASSERTIONS = 0
Settings.DISABLE_EXCEPTION_CATCHING = 1
+ Settings.EMIT_GENERATED_FUNCTIONS = 1
if opt_level >= 2:
Settings.RELOOP = 1
if opt_level >= 3:
- Settings.INLINING_LIMIT = 0
+ # Aside from these, -O3 also runs closure compiler and llvm lto
Settings.DOUBLE_MODE = 0
Settings.PRECISE_I64_MATH = 0
if noisy: print >> sys.stderr, 'Warning: Applying some potentially unsafe optimizations! (Use -O2 if this fails.)'
@@ -662,6 +679,9 @@ set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)''' % { 'winfix': '' if not WINDOWS e
def make(args, stdout=None, stderr=None, env=None):
if env is None:
env = Building.get_building_env()
+ if not args:
+ print >> sys.stderr, 'Error: Executable to run not specified.'
+ sys.exit(1)
#args += ['VERBOSE=1']
try:
Popen(args, stdout=stdout, stderr=stderr, env=env).communicate()
@@ -745,12 +765,16 @@ set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)''' % { 'winfix': '' if not WINDOWS e
resolved_symbols = set()
temp_dirs = []
files = map(os.path.abspath, files)
+ has_ar = False
+ for f in files:
+ has_ar = has_ar or Building.is_ar(f)
for f in files:
if not Building.is_ar(f):
if Building.is_bitcode(f):
- new_symbols = Building.llvm_nm(f)
- resolved_symbols = resolved_symbols.union(new_symbols.defs)
- unresolved_symbols = unresolved_symbols.union(new_symbols.undefs.difference(resolved_symbols)).difference(new_symbols.defs)
+ if has_ar:
+ new_symbols = Building.llvm_nm(f)
+ resolved_symbols = resolved_symbols.union(new_symbols.defs)
+ unresolved_symbols = unresolved_symbols.union(new_symbols.undefs.difference(resolved_symbols)).difference(new_symbols.defs)
actual_files.append(f)
else:
# Extract object files from ar archives, and link according to gnu ld semantics
@@ -803,7 +827,37 @@ set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)''' % { 'winfix': '' if not WINDOWS e
# Finish link
actual_files = unique_ordered(actual_files) # tolerate people trying to link a.so a.so etc.
if DEBUG: print >>sys.stderr, 'emcc: llvm-linking:', actual_files
- output = Popen([LLVM_LINK] + actual_files + ['-o', target], stdout=PIPE).communicate()[0]
+
+ # check for too-long command line
+ link_cmd = [LLVM_LINK] + actual_files + ['-o', target]
+ # 8k is a bit of an arbitrary limit, but a reasonable one
+ # for max command line size before we use a respose file
+ response_file = None
+ if WINDOWS and len(' '.join(link_cmd)) > 8192:
+ if DEBUG: print >>sys.stderr, 'using response file for llvm-link'
+ [response_fd, response_file] = mkstemp(suffix='.response', dir=TEMP_DIR)
+
+ link_cmd = [LLVM_LINK, "@" + response_file]
+
+ response_fh = os.fdopen(response_fd, 'w')
+ for arg in actual_files:
+ # we can't put things with spaces in the response file
+ if " " in arg:
+ link_cmd.append(arg)
+ else:
+ response_fh.write(arg + "\n")
+ response_fh.close()
+ link_cmd.append("-o")
+ link_cmd.append(target)
+
+ if len(' '.join(link_cmd)) > 8192:
+ print >>sys.stderr, 'emcc: warning: link command line is very long, even with response file -- use paths with no spaces'
+
+ output = Popen(link_cmd, stdout=PIPE).communicate()[0]
+
+ if response_file:
+ os.unlink(response_file)
+
assert os.path.exists(target) and (output is None or 'Could not open input file' not in output), 'Linking error: ' + output
for temp_dir in temp_dirs:
try_delete(temp_dir)
@@ -825,6 +879,7 @@ set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)''' % { 'winfix': '' if not WINDOWS e
def llvm_opt(filename, opts):
if type(opts) is int:
opts = Building.pick_llvm_opts(opts)
+ #opts += ['-debug-pass=Arguments']
if DEBUG: print >> sys.stderr, 'emcc: LLVM opts:', opts
output = Popen([LLVM_OPT, filename] + opts + ['-o=' + filename + '.opt.bc'], stdout=PIPE).communicate()[0]
assert os.path.exists(filename + '.opt.bc'), 'Failed to run llvm optimizations: ' + output
@@ -861,8 +916,14 @@ set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)''' % { 'winfix': '' if not WINDOWS e
assert os.path.exists(output_filename), 'Could not create bc file: ' + output
return output_filename
+ nm_cache = {} # cache results of nm - it can be slow to run
+
@staticmethod
def llvm_nm(filename, stdout=PIPE, stderr=None):
+ if filename in Building.nm_cache:
+ #if DEBUG: print >> sys.stderr, 'loading nm results for %s from cache' % filename
+ return Building.nm_cache[filename]
+
# LLVM binary ==> list of symbols
output = Popen([LLVM_NM, filename], stdout=stdout, stderr=stderr).communicate()[0]
class ret:
@@ -883,6 +944,7 @@ set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)''' % { 'winfix': '' if not WINDOWS e
ret.defs = set(ret.defs)
ret.undefs = set(ret.undefs)
ret.commons = set(ret.commons)
+ Building.nm_cache[filename] = ret
return ret
@staticmethod
@@ -1038,7 +1100,7 @@ set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)''' % { 'winfix': '' if not WINDOWS e
@staticmethod
def js_optimizer(filename, passes, jcache):
- return js_optimizer.run(filename, passes, NODE_JS, jcache)
+ return js_optimizer.run(filename, passes, listify(NODE_JS), jcache)
@staticmethod
def closure_compiler(filename):
@@ -1083,24 +1145,6 @@ set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)''' % { 'winfix': '' if not WINDOWS e
@staticmethod
def is_bitcode(filename):
- # checks if a file contains LLVM bitcode
- # if the file doesn't exist or doesn't have valid symbols, it isn't bitcode
- try:
- defs = Building.llvm_nm(filename, stderr=PIPE)
- # If no symbols found, it might just be an empty bitcode file, try to dis it
- if len(defs.defs) + len(defs.undefs) + len(defs.commons) == 0:
- # llvm-nm 3.0 has a bug when reading symbols from ar files
- # so try to see if we're dealing with an ar file, in which
- # case we should try to dis it.
- if not Building.is_ar(filename):
- test_ll = os.path.join(EMSCRIPTEN_TEMP_DIR, 'test.ll')
- Building.llvm_dis(filename, test_ll)
- assert os.path.exists(test_ll)
- try_delete(test_ll)
- except Exception, e:
- if DEBUG: print >> sys.stderr, 'shared.Building.is_bitcode failed to test whether file \'%s\' is a llvm bitcode file! Failed on exception: %s' % (filename, e)
- return False
-
# look for magic signature
b = open(filename, 'r').read(4)
if b[0] == 'B' and b[1] == 'C':
@@ -1176,6 +1220,10 @@ class Cache:
except:
pass
try_delete(RELOOPER)
+ try:
+ open(Cache.dirname + '__last_clear', 'w').write('last clear: ' + time.asctime() + '\n')
+ except:
+ print >> sys.stderr, 'failed to save last clear time'
# Request a cached file. If it isn't in the cache, it will be created with
# the given creator function
@@ -1218,29 +1266,30 @@ class JCache:
# Returns a cached value, if it exists. Make sure the full key matches
@staticmethod
def get(shortkey, keys):
- #if DEBUG: print >> sys.stderr, 'jcache get?', shortkey
+ if DEBUG_CACHE: print >> sys.stderr, 'jcache get?', shortkey
cachename = JCache.get_cachename(shortkey)
if not os.path.exists(cachename):
- #if DEBUG: print >> sys.stderr, 'jcache none at all'
+ if DEBUG_CACHE: print >> sys.stderr, 'jcache none at all'
return
data = cPickle.Unpickler(open(cachename, 'rb')).load()
if len(data) != 2:
- #if DEBUG: print >> sys.stderr, 'jcache error in get'
+ if DEBUG_CACHE: print >> sys.stderr, 'jcache error in get'
return
oldkeys = data[0]
if len(oldkeys) != len(keys):
- #if DEBUG: print >> sys.stderr, 'jcache collision (a)'
+ if DEBUG_CACHE: print >> sys.stderr, 'jcache collision (a)'
return
for i in range(len(oldkeys)):
if oldkeys[i] != keys[i]:
- #if DEBUG: print >> sys.stderr, 'jcache collision (b)'
+ if DEBUG_CACHE: print >> sys.stderr, 'jcache collision (b)'
return
- #if DEBUG: print >> sys.stderr, 'jcache win'
+ if DEBUG_CACHE: print >> sys.stderr, 'jcache win'
return data[1]
# Sets the cached value for a key (from get_key)
@staticmethod
def set(shortkey, keys, value):
+ if DEBUG_CACHE: print >> sys.stderr, 'save to cache', shortkey
cachename = JCache.get_cachename(shortkey)
cPickle.Pickler(open(cachename, 'wb')).dump([keys, value])
#if DEBUG:
@@ -1264,28 +1313,36 @@ class JCache:
if os.path.exists(chunking_file):
try:
previous_mapping = cPickle.Unpickler(open(chunking_file, 'rb')).load() # maps a function identifier to the chunk number it will be in
- except:
- pass
+ if DEBUG: print >> sys.stderr, 'jscache previous mapping of size %d loaded from %s' % (len(previous_mapping), chunking_file)
+ except Exception, e:
+ print >> sys.stderr, 'Failed to load and unpickle previous chunking file at %s: ' % chunking_file, e
+ else:
+ print >> sys.stderr, 'Previous chunking file not found at %s' % chunking_file
chunks = []
if previous_mapping:
# initialize with previous chunking
news = []
for func in funcs:
ident, data = func
+ assert ident, 'need names for jcache chunking'
if not ident in previous_mapping:
news.append(func)
else:
n = previous_mapping[ident]
while n >= len(chunks): chunks.append([])
chunks[n].append(func)
+ if DEBUG: print >> sys.stderr, 'jscache not in previous chunking', len(news)
# add news and adjust for new sizes
spilled = news
- for chunk in chunks:
+ for i in range(len(chunks)):
+ chunk = chunks[i]
size = sum([len(func[1]) for func in chunk])
- while size > 1.5*chunk_size and len(chunk) > 0:
+ #if DEBUG: print >> sys.stderr, 'need spilling?', i, size, len(chunk), 'vs', chunk_size, 1.5*chunk_size
+ while size > 1.5*chunk_size and len(chunk) > 1:
spill = chunk.pop()
spilled.append(spill)
size -= len(spill[1])
+ #if DEBUG: print >> sys.stderr, 'jscache new + spilled', len(spilled)
for chunk in chunks:
size = sum([len(func[1]) for func in chunk])
while size < 0.66*chunk_size and len(spilled) > 0:
@@ -1294,6 +1351,7 @@ class JCache:
size += len(spill[1])
chunks = filter(lambda chunk: len(chunk) > 0, chunks) # might have empty ones, eliminate them
funcs = spilled # we will allocate these into chunks as if they were normal inputs
+ #if DEBUG: print >> sys.stderr, 'leftover spills', len(spilled)
# initialize reasonably, the rest of the funcs we need to split out
curr = []
total_size = 0
@@ -1319,15 +1377,19 @@ class JCache:
for i in range(len(chunks)):
chunk = chunks[i]
for ident, data in chunk:
+ assert ident not in new_mapping, 'cannot have duplicate names in jcache chunking'
new_mapping[ident] = i
cPickle.Pickler(open(chunking_file, 'wb')).dump(new_mapping)
+ if DEBUG: print >> sys.stderr, 'jscache mapping of size %d saved to %s' % (len(new_mapping), chunking_file)
#if DEBUG:
+ # for i in range(len(chunks)):
+ # chunk = chunks[i]
+ # print >> sys.stderr, 'final chunk', i, len(chunk)
+ # print >> sys.stderr, 'new mapping:', new_mapping
# if previous_mapping:
# for ident in set(previous_mapping.keys() + new_mapping.keys()):
# if previous_mapping.get(ident) != new_mapping.get(ident):
# print >> sys.stderr, 'mapping inconsistency', ident, previous_mapping.get(ident), new_mapping.get(ident)
- # for key, value in new_mapping.iteritems():
- # print >> sys.stderr, 'mapping:', key, value
return [''.join([func[1] for func in chunk]) for chunk in chunks] # remove function names
class JS:
diff --git a/tools/test-js-optimizer-regs-output.js b/tools/test-js-optimizer-regs-output.js
index 36006b7c..fe7de5fb 100644
--- a/tools/test-js-optimizer-regs-output.js
+++ b/tools/test-js-optimizer-regs-output.js
@@ -225,4 +225,8 @@ function switchey(r1) {
r9 = r1 + 2;
pp(r9);
}
+function __ZN14NetworkAddressC1EPKcti(r1) {
+ __ZN14NetworkAddressC2EPKcti(r1);
+ return;
+}
diff --git a/tools/test-js-optimizer-regs.js b/tools/test-js-optimizer-regs.js
index 4802afa3..3013e518 100644
--- a/tools/test-js-optimizer-regs.js
+++ b/tools/test-js-optimizer-regs.js
@@ -230,4 +230,8 @@ function switchey(x) {
var aaa = x+2;
pp(aaa);
}
-// EMSCRIPTEN_GENERATED_FUNCTIONS: ["test", "primes", "atomic", "fcntl_open", "ex", "switchey"]
+function __ZN14NetworkAddressC1EPKcti($this) {
+ __ZN14NetworkAddressC2EPKcti($this);
+ return;
+}
+// EMSCRIPTEN_GENERATED_FUNCTIONS: ["test", "primes", "atomic", "fcntl_open", "ex", "switchey", "__ZN14NetworkAddressC1EPKcti"]