diff options
46 files changed, 1706 insertions, 3944 deletions
@@ -2,6 +2,7 @@ *.pyc *~ *.bc +src/relooper*.js # Ignore generated files src/relooper.js @@ -724,8 +724,6 @@ try: 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 minify_whitespace is None: - minify_whitespace = closure # if closure is run, minify whitespace if opt_level <= 0: keep_debug = True # always keep debug in -O0 if DEBUG: start_time = time.time() # done after parsing arguments, which might affect debug state @@ -854,9 +852,23 @@ try: exec('shared.Settings.' + key + ' = ' + value) # Apply effects from settings + if shared.Settings.ASM_JS: + if closure: + print >> sys.stderr, 'emcc: warning: disabling closure because it is not compatible with asm.js code generation' + closure = False + if shared.Settings.CORRECT_SIGNS != 1: + print >> sys.stderr, 'emcc: warning: setting CORRECT_SIGNS to 1 for asm.js code generation' + shared.Settings.CORRECT_SIGNS = 1 + if shared.Settings.CORRECT_OVERFLOWS != 1: + print >> sys.stderr, 'emcc: warning: setting CORRECT_OVERFLOWS to 1 for asm.js code generation' + 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 + if minify_whitespace is None: + minify_whitespace = closure # if closure is run, minify whitespace + ## Compile source code to bitcode if DEBUG: print >> sys.stderr, 'emcc: compiling to bitcode' @@ -1138,6 +1150,16 @@ try: execute(shlex.split(js_transform, posix=posix) + [os.path.abspath(final)]) if DEBUG: save_intermediate('transformed') + if shared.Settings.ASM_JS: # XXX temporary wrapping for testing purposes + unwrapped = open(final).read() + final += '.asmwrap.js' + open(final, 'w').write(''' +(function() { // prevent new Function from seeing the global scope +%s +}).apply(null, arguments); +''' % unwrapped) + if DEBUG: save_intermediate('asmwrap') + # It is useful to run several js optimizer passes together, to save on unneeded unparsing/reparsing js_optimizer_queue = [] def flush_js_optimizer_queue(): @@ -1163,7 +1185,12 @@ try: if DEBUG: save_intermediate('pretty') def get_eliminate(): - return 'eliminate' if not shared.Settings.ALLOW_MEMORY_GROWTH else 'eliminateMemSafe' + if shared.Settings.ASM_JS: + return 'eliminateAsm' + elif shared.Settings.ALLOW_MEMORY_GROWTH: + return 'eliminateMemSafe' + else: + return 'eliminate' js_optimizer_queue += [get_eliminate()] @@ -1177,6 +1204,8 @@ 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 += ['registerizeAsm'] # we can't use closure in asm, but this does much of the same if opt_level >= 1: if DEBUG: print >> sys.stderr, 'emcc: running post-closure post-opts' diff --git a/emscripten.py b/emscripten.py index 98dcb6bb..e200ddd9 100755 --- a/emscripten.py +++ b/emscripten.py @@ -129,10 +129,12 @@ def emscript(infile, settings, outfile, libraries=[]): # Save settings to a file to work around v8 issue 1579 settings_file = temp_files.get('.txt').name - settings_text = json.dumps(settings) - s = open(settings_file, 'w') - s.write(settings_text) - s.close() + def save_settings(): + settings_text = json.dumps(settings) + s = open(settings_file, 'w') + s.write(settings_text) + s.close() + save_settings() # Phase 1 - pre if DEBUG: t = time.time() @@ -170,6 +172,9 @@ def emscript(infile, settings, outfile, libraries=[]): if DEBUG: t = time.time() forwarded_json = json.loads(forwarded_data) indexed_functions = set() + if settings.get('ASM_JS'): + settings['EXPORTED_FUNCTIONS'] = forwarded_json['EXPORTED_FUNCTIONS'] + save_settings() chunks = shared.JCache.chunkify(funcs, chunk_size, 'emscript_files' if jcache else None) @@ -223,16 +228,25 @@ def emscript(infile, settings, outfile, libraries=[]): if DEBUG: print >> sys.stderr, ' emscript: phase 2 took %s seconds' % (time.time() - t) if DEBUG: t = time.time() - funcs_js = ''.join([output[0] for output in outputs]) - + # merge forwarded data + if settings.get('ASM_JS'): + all_exported_functions = set(settings['EXPORTED_FUNCTIONS']) # both asm.js and otherwise + exported_implemented_functions = set() for func_js, curr_forwarded_data in outputs: - # merge forwarded data curr_forwarded_json = json.loads(curr_forwarded_data) forwarded_json['Types']['preciseI64MathUsed'] = forwarded_json['Types']['preciseI64MathUsed'] or curr_forwarded_json['Types']['preciseI64MathUsed'] for key, value in curr_forwarded_json['Functions']['blockAddresses'].iteritems(): forwarded_json['Functions']['blockAddresses'][key] = value for key in curr_forwarded_json['Functions']['indexedFunctions'].iterkeys(): indexed_functions.add(key) + if settings.get('ASM_JS'): + for key in curr_forwarded_json['Functions']['implementedFunctions'].iterkeys(): + if key in all_exported_functions: exported_implemented_functions.add(key) + for key, value in curr_forwarded_json['Functions']['unimplementedFunctions'].iteritems(): + forwarded_json['Functions']['unimplementedFunctions'][key] = value + + funcs_js = ''.join([output[0] for output in outputs]) + outputs = None if DEBUG: print >> sys.stderr, ' emscript: phase 2b took %s seconds' % (time.time() - t) if DEBUG: t = time.time() @@ -241,6 +255,7 @@ def emscript(infile, settings, outfile, libraries=[]): forwarded_json['Functions']['indexedFunctions'] = {} i = 2 for indexed in indexed_functions: + #print >> sys.stderr, 'indaxx', indexed, i forwarded_json['Functions']['indexedFunctions'][indexed] = i # make sure not to modify this python object later - we use it in indexize i += 2 forwarded_json['Functions']['nextIndex'] = i @@ -258,8 +273,6 @@ def emscript(infile, settings, outfile, libraries=[]): pre = None #if DEBUG: outfile.write('// funcs\n') - outfile.write(blockaddrsize(indexize(funcs_js))) - funcs_js = None # forward forwarded_data = json.dumps(forwarded_json) @@ -272,8 +285,146 @@ 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')) - #if DEBUG: outfile.write('// post\n') - outfile.write(indexize(out)) + post, last_forwarded_data = out.split('//FORWARDED_DATA:') + last_forwarded_json = json.loads(last_forwarded_data) + + if settings.get('ASM_JS'): + class Counter: + i = 0 + def make_table(sig, raw): + i = Counter.i + Counter.i += 1 + bad = 'b' + str(i) + params = ','.join(['p%d' % p for p in range(len(sig)-1)]) + coercions = ';'.join(['p%d = %sp%d%s' % (p, '+' if sig[p+1] == 'd' else '', p, '' if sig[p+1] == 'd' else '|0') for p in range(len(sig)-1)]) + ';' + ret = '' if sig[0] == 'v' else ('return %s0' % ('+' if sig[0] == 'd' else '')) + return 'function %s(%s) { %s abort(%d); %s };\n' % (bad, params, coercions, i, ret) + raw.replace('[0,', '[' + bad + ',').replace(',0,', ',' + bad + ',').replace(',0,', ',' + bad + ',').replace(',0]', ',' + bad + ']').replace(',0]', ',' + bad + ']') + function_tables_defs = '\n'.join([make_table(sig, raw) for sig, raw in last_forwarded_json['Functions']['tables'].iteritems()]) + + asm_setup = '\n'.join(['var %s = %s;' % (f.replace('.', '_'), f) for f in ['Runtime.bitshift64', 'Math.floor', 'Math.min']]) + fundamentals = ['buffer', 'Int8Array', 'Int16Array', 'Int32Array', 'Uint8Array', 'Uint16Array', 'Uint32Array', 'Float32Array', 'Float64Array'] + basics = ['abort', 'assert', 'STACKTOP', 'STACK_MAX', 'tempDoublePtr', 'ABORT', 'Runtime_bitshift64', 'Math_floor', 'Math_min'] + if not settings['NAMED_GLOBALS']: basics += ['GLOBAL_BASE'] + if forwarded_json['Types']['preciseI64MathUsed']: + basics += ['i64Math_' + op for op in ['add', 'subtract', 'multiply', 'divide', 'modulo']] + asm_setup += ''' +var i64Math_add = function(a, b, c, d) { i64Math.add(a, b, c, d) }; +var i64Math_subtract = function(a, b, c, d) { i64Math.subtract(a, b, c, d) }; +var i64Math_multiply = function(a, b, c, d) { i64Math.multiply(a, b, c, d) }; +var i64Math_divide = function(a, b, c, d, e) { i64Math.divide(a, b, c, d, e) }; +var i64Math_modulo = function(a, b, c, d, e) { i64Math.modulo(a, b, c, d, e) }; +''' + asm_runtime_funcs = ['stackAlloc', 'stackSave', 'stackRestore', 'setThrew'] + ['setTempRet%d' % i for i in range(10)] + # function tables + function_tables = ['dynCall_' + table for table in last_forwarded_json['Functions']['tables']] + function_tables_impls = [] + for sig in last_forwarded_json['Functions']['tables'].iterkeys(): + args = ','.join(['a' + str(i) for i in range(1, len(sig))]) + arg_coercions = ' '.join(['a' + str(i) + '=' + ('+' if sig[i] == 'd' else '') + 'a' + str(i) + ('|0' if sig[i] == 'i' else '') + ';' for i in range(1, len(sig))]) + function_tables_impls.append(''' + function dynCall_%s(index%s%s) { + %s + %sFUNCTION_TABLE_%s[index&{{{ FTM_%s }}}](%s); + } +''' % (sig, ',' if len(sig) > 1 else '', args, arg_coercions, 'return ' if sig[0] != 'v' else '', sig, sig, args)) + # calculate exports + exported_implemented_functions = list(exported_implemented_functions) + exports = [] + for export in exported_implemented_functions + asm_runtime_funcs + function_tables: + exports.append("'%s': %s" % (export, export)) + exports = '{ ' + ', '.join(exports) + ' }' + # calculate globals + try: + del forwarded_json['Variables']['globals']['_llvm_global_ctors'] # not a true variable + except: + pass + global_vars = forwarded_json['Variables']['globals'].keys() if settings['NAMED_GLOBALS'] else [] + global_funcs = ['_' + x for x in forwarded_json['Functions']['libraryFunctions'].keys()] + asm_globals = ''.join([' var ' + g + '=env.' + g + ';\n' for g in basics + global_funcs + global_vars]) + # sent data + sending = '{ ' + ', '.join([s + ': ' + s for s in fundamentals + basics + global_funcs + global_vars]) + ' }' + # received + receiving = ';\n'.join(['var ' + s + ' = Module["' + s + '"] = asm.' + s for s in exported_implemented_functions + function_tables]) + # finalize + funcs_js = ''' +%s +var asmPre = (function(env, buffer) { + 'use asm'; + var HEAP8 = new env.Int8Array(buffer); + var HEAP16 = new env.Int16Array(buffer); + var HEAP32 = new env.Int32Array(buffer); + var HEAPU8 = new env.Uint8Array(buffer); + var HEAPU16 = new env.Uint16Array(buffer); + var HEAPU32 = new env.Uint32Array(buffer); + var HEAPF32 = new env.Float32Array(buffer); + var HEAPF64 = new env.Float64Array(buffer); +''' % (asm_setup,) + asm_globals + ''' + var __THREW__ = 0; + var undef = 0; + + function stackAlloc(size) { + var ret = STACKTOP; + STACKTOP = (STACKTOP + size)|0; + STACKTOP = ((STACKTOP + 3)>>2)<<2; + return ret|0; + } + function stackSave() { + return STACKTOP|0; + } + function stackRestore(top) { + top = top|0; + STACKTOP = top; + } + function setThrew(threw) { + threw = threw|0; + __THREW__ = threw; + } +''' + ''.join([''' + var tempRet%d = 0; + function setTempRet%d(value) { + value = value|0; + tempRet%d = value; + } +''' % (i, i, i) for i in range(10)]) + funcs_js.replace('\n', '\n ') + ''' + + %s + + return %s; +}); +if (asmPre.toSource) { // works in sm but not v8, so we get full coverage between those two + asmPre = asmPre.toSource(); + asmPre = asmPre.substr(25, asmPre.length-28); + asmPre = new Function('env', 'buffer', asmPre); +} +var asm = asmPre(%s, buffer); // pass through Function to prevent seeing outside scope +%s; +Runtime.stackAlloc = function(size) { return asm.stackAlloc(size) }; +Runtime.stackSave = function() { return asm.stackSave() }; +Runtime.stackRestore = function(top) { asm.stackRestore(top) }; +''' % (function_tables_defs.replace('\n', '\n ') + '\n' + '\n'.join(function_tables_impls), exports, sending, receiving) + + # Set function table masks + def function_table_maskize(js): + masks = {} + default = None + for sig, table in last_forwarded_json['Functions']['tables'].iteritems(): + masks[sig] = str(table.count(',')) + default = sig + def fix(m): + sig = m.groups(0)[0] + if not sig in masks: + print >> sys.stderr, 'warning: function table use without functions for it!', sig + return masks[default] # TODO: generate empty function tables for this case, even though it would fail at runtime if used + return masks[sig] + return re.sub(r'{{{ FTM_([\w\d_$]+) }}}', lambda m: fix(m), js) # masks[m.groups(0)[0]] + funcs_js = function_table_maskize(funcs_js) + else: + function_tables_defs = '\n'.join([table for table in last_forwarded_json['Functions']['tables'].itervalues()]) + outfile.write(function_tables_defs) + outfile.write(blockaddrsize(indexize(funcs_js))) + funcs_js = None + + outfile.write(indexize(post)) if DEBUG: print >> sys.stderr, ' emscript: phase 3 took %s seconds' % (time.time() - t) outfile.close() diff --git a/src/analyzer.js b/src/analyzer.js index 014579f4..0ad3e017 100644 --- a/src/analyzer.js +++ b/src/analyzer.js @@ -19,7 +19,7 @@ function recomputeLines(func) { var BRANCH_INVOKE = set('branch', 'invoke'); var SIDE_EFFECT_CAUSERS = set('call', 'invoke', 'atomic'); -var UNUNFOLDABLE = set('value', 'type', 'phiparam'); +var UNUNFOLDABLE = set('value', 'structvalue', 'type', 'phiparam'); // Analyzer @@ -120,12 +120,14 @@ function analyzer(data, sidePass) { processItem: function(data) { // Legalization if (USE_TYPED_ARRAYS == 2) { - function getLegalVars(base, bits) { - assert(!isNumber(base)); + function getLegalVars(base, bits, allowLegal) { + if (allowLegal && bits <= 32) return [{ ident: base, bits: bits }]; + if (isNumber(base)) return getLegalLiterals(base, bits); var ret = new Array(Math.ceil(bits/32)); var i = 0; + if (base == 'zeroinitializer' || base == 'undef') base = 0; while (bits > 0) { - ret[i] = { ident: base + '$' + i, bits: Math.min(32, bits) }; + ret[i] = { ident: base ? base + '$' + i : '0', bits: Math.min(32, bits) }; bits -= 32; i++; } @@ -142,6 +144,23 @@ function analyzer(data, sidePass) { } return ret; } + function getLegalStructuralParts(value) { + return value.params.slice(0); + } + function getLegalParams(params, bits) { + return params.map(function(param) { + var value = param.value || param; + if (isNumber(value.ident)) { + return getLegalLiterals(value.ident, bits); + } else if (value.intertype == 'structvalue') { + return getLegalStructuralParts(value).map(function(part) { + return { ident: part.ident, bits: part.type.substr(1) }; + }); + } else { + return getLegalVars(value.ident, bits); + } + }); + } // Uses the right factor to multiply line numbers by so that they fit in between // the line[i] and the line after it function interpLines(lines, i, toAdd) { @@ -191,6 +210,7 @@ function analyzer(data, sidePass) { // Legalize lines in labels var tempId = 0; func.labels.forEach(function(label) { + if (dcheck('legalizer')) dprint('zz legalizing: \n' + dump(label.lines)); var i = 0, bits; while (i < label.lines.length) { var item = label.lines[i]; @@ -207,8 +227,12 @@ function analyzer(data, sidePass) { if (isIllegalType(item.valueType) || isIllegalType(item.type)) { isIllegal = true; } + if ((item.intertype == 'load' || item.intertype == 'store') && isStructType(item.valueType)) { + isIllegal = true; // storing an entire structure is illegal + } }); if (!isIllegal) { + //if (dcheck('legalizer')) dprint('no need to legalize \n' + dump(item)); i++; continue; } @@ -222,10 +246,10 @@ function analyzer(data, sidePass) { if (subItem != item && (!(subItem.intertype in UNUNFOLDABLE) || (subItem.intertype == 'value' && isNumber(subItem.ident) && isIllegalType(subItem.type)))) { if (item.intertype == 'phi') { - assert(subItem.intertype == 'value', 'We can only unfold illegal constants in phis'); + assert(subItem.intertype == 'value' || subItem.intertype == 'structvalue', 'We can only unfold illegal constants in phis'); // we must handle this in the phi itself, if we unfold normally it will not be pushed back with the phi } else { - var tempIdent = '$$emscripten$temp$' + (tempId++); + var tempIdent = '$$etemp$' + (tempId++); subItem.assignTo = tempIdent; unfolded.unshift(subItem); fixUnfolded(subItem); @@ -234,7 +258,7 @@ function analyzer(data, sidePass) { } else if (subItem.intertype == 'switch' && isIllegalType(subItem.type)) { subItem.switchLabels.forEach(function(switchLabel) { if (switchLabel.value[0] != '$') { - var tempIdent = '$$emscripten$temp$' + (tempId++); + var tempIdent = '$$etemp$' + (tempId++); unfolded.unshift({ assignTo: tempIdent, intertype: 'value', @@ -258,8 +282,7 @@ function analyzer(data, sidePass) { case 'store': { var toAdd = []; bits = getBits(item.valueType); - var elements; - elements = getLegalVars(item.value.ident, bits); + var elements = getLegalParams([item.value], bits)[0]; var j = 0; elements.forEach(function(element) { var tempVar = '$st$' + i + '$' + j; @@ -290,32 +313,43 @@ function analyzer(data, sidePass) { i += removeAndAdd(label.lines, i, toAdd); continue; } - // call, return: Return value is in an unlegalized array literal. Not fully optimal. + // call, return: Return the first 32 bits, the rest are in temp case 'call': { bits = getBits(value.type); var elements = getLegalVars(item.assignTo, bits); var toAdd = [value]; // legalize parameters legalizeFunctionParameters(value.params); - if (value.assignTo) { + if (value.assignTo && isIllegalType(item.type)) { // legalize return value - var j = 0; - toAdd = toAdd.concat(elements.map(function(element) { - return { + value.assignTo = elements[0].ident; + for (var j = 1; j < elements.length; j++) { + var element = elements[j]; + toAdd.push({ intertype: 'value', assignTo: element.ident, - type: 'i' + bits, - ident: value.assignTo + '[' + (j++) + ']' - }; - })); + type: element.bits, + ident: 'tempRet' + (j - 1) + }); + assert(j<10); // TODO: dynamically create more than 10 tempRet-s + } } i += removeAndAdd(label.lines, i, toAdd); continue; } + case 'landingpad': { + // not much to legalize + i++; + continue; + } case 'return': { bits = getBits(item.type); var elements = getLegalVars(item.value.ident, bits); - item.value.ident = '[' + elements.map(function(element) { return element.ident }).join(',') + ']'; + item.value.ident = '('; + for (var j = 1; j < elements.length; j++) { + item.value.ident += 'tempRet' + (j-1) + '=' + elements[j].ident + ','; + } + item.value.ident += elements[0].ident + ')'; i++; continue; } @@ -341,6 +375,21 @@ function analyzer(data, sidePass) { i += removeAndAdd(label.lines, i, toAdd); continue; } + case 'structvalue': { + bits = getBits(value.type); + var elements = getLegalVars(item.assignTo, bits); + var toAdd = []; + for (var j = 0; j < item.params.length; j++) { + toAdd[j] = { + intertype: 'value', + assignTo: elements[j].ident, + type: 'i32', + ident: item.params[j].ident + }; + } + i += removeAndAdd(label.lines, i, toAdd); + continue; + } case 'load': { bits = getBits(value.valueType); var elements = getLegalVars(item.assignTo, bits); @@ -382,13 +431,9 @@ function analyzer(data, sidePass) { var toAdd = []; var elements = getLegalVars(item.assignTo, bits); var j = 0; - var literalValues = {}; // special handling of literals - we cannot unfold them normally - value.params.map(function(param) { - if (isNumber(param.value.ident)) { - literalValues[param.value.ident] = getLegalLiterals(param.value.ident, bits); - } - }); + var values = getLegalParams(value.params, bits); elements.forEach(function(element) { + var k = 0; toAdd.push({ intertype: 'phi', assignTo: element.ident, @@ -399,7 +444,7 @@ function analyzer(data, sidePass) { label: param.label, value: { intertype: 'value', - ident: (param.value.ident in literalValues) ? literalValues[param.value.ident][j].ident : (param.value.ident + '$' + j), + ident: values[k++][j].ident, type: 'i' + element.bits, } }; @@ -414,6 +459,62 @@ function analyzer(data, sidePass) { i++; continue; // special case, handled in makeComparison } + case 'extractvalue': { // XXX we assume 32-bit alignment in extractvalue/insertvalue, + // but in theory they can run on packed structs too (see use getStructuralTypePartBits) + // potentially legalize the actual extracted value too if it is >32 bits, not just the extraction in general + var index = item.indexes[0][0].text; + var parts = getStructureTypeParts(item.type); + var indexedType = parts[index]; + var targetBits = getBits(indexedType); + var sourceBits = getBits(item.type); + var elements = getLegalVars(item.assignTo, targetBits, true); // possibly illegal + var sourceElements = getLegalVars(item.ident, sourceBits); // definitely illegal + var toAdd = []; + var sourceIndex = 0; + for (var partIndex = 0; partIndex < parts.length; partIndex++) { + if (partIndex == index) { + for (var j = 0; j < elements.length; j++) { + toAdd.push({ + intertype: 'value', + assignTo: elements[j].ident, + type: 'i' + elements[j].bits, + ident: sourceElements[sourceIndex+j].ident + }); + } + break; + } + sourceIndex += getStructuralTypePartBits(parts[partIndex])/32; + } + i += removeAndAdd(label.lines, i, toAdd); + continue; + } + case 'insertvalue': { + var index = item.indexes[0][0].text; // the modified index + var parts = getStructureTypeParts(item.type); + var indexedType = parts[index]; + var indexBits = getBits(indexedType); + var bits = getBits(item.type); // source and target + bits = getBits(value.type); + var toAdd = []; + var elements = getLegalVars(item.assignTo, bits); + var sourceElements = getLegalVars(item.ident, bits); + var indexElements = getLegalVars(item.value.ident, indexBits, true); // possibly legal + var sourceIndex = 0; + for (var partIndex = 0; partIndex < parts.length; partIndex++) { + var currNum = getStructuralTypePartBits(parts[partIndex])/32; + for (var j = 0; j < currNum; j++) { + toAdd.push({ + intertype: 'value', + assignTo: elements[sourceIndex+j].ident, + type: 'i' + elements[sourceIndex+j].bits, + ident: partIndex == index ? indexElements[j].ident : sourceElements[sourceIndex+j].ident + }); + } + sourceIndex += currNum; + } + i += removeAndAdd(label.lines, i, toAdd); + continue; + } case 'bitcast': { var inType = item.type2; var outType = item.type; @@ -477,17 +578,16 @@ function analyzer(data, sidePass) { } case 'select': { sourceBits = targetBits = getBits(value.params[1].type); - var otherElementsA = getLegalVars(value.params[1].ident, sourceBits); - var otherElementsB = getLegalVars(value.params[2].ident, sourceBits); + var params = getLegalParams(value.params.slice(1), sourceBits); processor = function(result, j) { return { intertype: 'mathop', op: 'select', - type: 'i' + otherElementsA[j].bits, + type: 'i' + params[0][j].bits, params: [ value.params[0], - { intertype: 'value', ident: otherElementsA[j].ident, type: 'i' + otherElementsA[j].bits }, - { intertype: 'value', ident: otherElementsB[j].ident, type: 'i' + otherElementsB[j].bits } + { intertype: 'value', ident: params[0][j].ident, type: 'i' + params[0][j].bits }, + { intertype: 'value', ident: params[1][j].ident, type: 'i' + params[1][j].bits } ] }; }; @@ -554,9 +654,10 @@ function analyzer(data, sidePass) { // We can't statically legalize this, do the operation at runtime TODO: optimize assert(sourceBits == 64, 'TODO: handle nonconstant shifts on != 64 bits'); value.intertype = 'value'; - value.ident = 'Runtime.bitshift64(' + sourceElements[0].ident + ', ' + + value.ident = 'Runtime' + (ASM_JS ? '_' : '.') + 'bitshift64(' + sourceElements[0].ident + ', ' + sourceElements[1].ident + ',"' + value.op + '",' + value.params[1].ident + '$0);' + - 'var ' + value.assignTo + '$0 = ' + value.assignTo + '[0], ' + value.assignTo + '$1 = ' + value.assignTo + '[1];'; + 'var ' + value.assignTo + '$0 = ' + makeGetTempDouble(0) + ', ' + value.assignTo + '$1 = ' + makeGetTempDouble(1) + ';'; + value.assignTo = null; i++; continue; } diff --git a/src/compiler.js b/src/compiler.js index 3ce53b1e..7ca20c40 100644 --- a/src/compiler.js +++ b/src/compiler.js @@ -172,18 +172,24 @@ RUNTIME_DEBUG = LIBRARY_DEBUG || GL_DEBUG; // Settings sanity checks assert(!(USE_TYPED_ARRAYS === 2 && QUANTUM_SIZE !== 4), 'For USE_TYPED_ARRAYS == 2, must have normal QUANTUM_SIZE of 4'); +if (ASM_JS) { + assert(!ALLOW_MEMORY_GROWTH, 'Cannot grow asm.js heap'); + assert((TOTAL_MEMORY&(TOTAL_MEMORY-1)) == 0, 'asm.js heap must be power of 2'); +} // Output some info and warnings based on settings -if (!MICRO_OPTS || !RELOOP || ASSERTIONS || CHECK_SIGNS || CHECK_OVERFLOWS || INIT_STACK || INIT_HEAP || - !SKIP_STACK_IN_SMALL || SAFE_HEAP || PGO || PROFILE || !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 (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) { + 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) { - print('// Note: Some Emscripten settings may limit the speed of the generated code.'); + if (DOUBLE_MODE || CORRECT_SIGNS || CORRECT_OVERFLOWS || CORRECT_ROUNDINGS) { + print('// Note: Some Emscripten settings may limit the speed of the generated code.'); + } } // Load compiler code diff --git a/src/intertyper.js b/src/intertyper.js index 1d18c3cf..2de6c6b9 100644 --- a/src/intertyper.js +++ b/src/intertyper.js @@ -125,6 +125,7 @@ function intertyper(data, sidePass, baseLineNums) { // We need this early, to know basic function info - ident, params, varargs ident: toNiceIdent(func.ident), params: func.params, + returnType: func.returnType, hasVarArgs: func.hasVarArgs, lineNum: currFunctionLineNum, lines: currFunctionLines @@ -520,7 +521,12 @@ function intertyper(data, sidePass, baseLineNums) { if (item.tokens[3].item) { var subTokens = item.tokens[3].item.tokens; splitTokenList(subTokens).forEach(function(segment) { - ret.ctors.push(segment[1].tokens.slice(-1)[0].text); + var ctor = toNiceIdent(segment[1].tokens.slice(-1)[0].text); + ret.ctors.push(ctor); + if (ASM_JS) { // must export the global constructors from asm.js module, so mark as implemented and exported + Functions.implementedFunctions[ctor] = 'v'; + EXPORTED_FUNCTIONS[ctor] = 1; + } }); } } else if (!external) { @@ -741,6 +747,7 @@ function intertyper(data, sidePass, baseLineNums) { } var last = getTokenIndexByText(item.tokens, ';'); item.params = splitTokenList(item.tokens.slice(1, last)).map(parseLLVMSegment); + item.type = item.params[1].type; this.forwardItem(item, 'Reintegrator'); } }); diff --git a/src/jsifier.js b/src/jsifier.js index 50703b90..5e159ccf 100644 --- a/src/jsifier.js +++ b/src/jsifier.js @@ -9,6 +9,8 @@ var STRUCT_LIST = set('struct', 'list'); var UNDERSCORE_OPENPARENS = set('_', '('); var RELOOP_IGNORED_LASTS = set('return', 'unreachable', 'resume'); +var addedLibraryItems = {}; + // JSifier function JSify(data, functionsOnly, givenFunctions) { var mainPass = !functionsOnly; @@ -42,7 +44,9 @@ function JSify(data, functionsOnly, givenFunctions) { var pre = processMacros(preprocess(read(preFile).replace('{{RUNTIME}}', getRuntime()))); print(pre); - Functions.implementedFunctions = set(data.unparsedFunctions.map(function(func) { return func.ident })); + data.unparsedFunctions.forEach(function(func) { + Functions.implementedFunctions[func.ident] = Functions.getSignature(func.returnType, func.params.map(function(param) { return param.type })); + }); } } @@ -258,7 +262,7 @@ function JSify(data, functionsOnly, givenFunctions) { var ret = [item]; if (item.ident == '_llvm_global_ctors') { item.JS = '\n__ATINIT__ = __ATINIT__.concat([\n' + - item.ctors.map(function(ctor) { return ' { func: ' + toNiceIdent(ctor) + ' }' }).join(',\n') + + item.ctors.map(function(ctor) { return ' { func: function() { ' + ctor + '() } }' }).join(',\n') + '\n]);\n'; return ret; } else { @@ -279,6 +283,7 @@ function JSify(data, functionsOnly, givenFunctions) { if (LibraryManager.library[shortident] && LibraryManager.library[shortident].length && !BUILD_AS_SHARED_LIB) { + if (addedLibraryItems[shortident]) return ret; var val = LibraryManager.library[shortident]; var padding; if (Runtime.isNumberType(item.type) || isPointerType(item.type)) { @@ -333,7 +338,7 @@ function JSify(data, functionsOnly, givenFunctions) { } js += '\n' + makePointer('[0]', null, allocator, ['void*'], index) + ';'; } - if (EXPORT_ALL || (item.ident in EXPORTED_GLOBALS)) { + if (!ASM_JS && (EXPORT_ALL || (item.ident in EXPORTED_GLOBALS))) { js += '\nModule["' + item.ident + '"] = ' + item.ident + ';'; } if (BUILD_AS_SHARED_LIB == 2 && !item.private_) { @@ -377,8 +382,6 @@ function JSify(data, functionsOnly, givenFunctions) { } }); - var addedLibraryItems = {}; - // functionStub substrate.addActor('FunctionStub', { processItem: function(item) { @@ -406,6 +409,7 @@ function JSify(data, functionsOnly, givenFunctions) { deps.push(snippet); snippet = '_' + snippet; } + if (ASM_JS) Functions.libraryFunctions[ident] = 1; } else if (typeof snippet === 'object') { snippet = stringifyWithFunctions(snippet); } else if (typeof snippet === 'function') { @@ -420,6 +424,7 @@ function JSify(data, functionsOnly, givenFunctions) { snippet = snippet.replace('{', '{ var ret = (function() { if (Runtime.debug) Module.printErr("[library call:' + ident + ': " + Array.prototype.slice.call(arguments).map(Runtime.prettyPrint) + "]"); '); snippet = snippet.substr(0, snippet.length-1) + '}).apply(this, arguments); if (Runtime.debug && typeof ret !== "undefined") Module.printErr(" [ return:" + Runtime.prettyPrint(ret)); return ret; }'; } + if (ASM_JS) Functions.libraryFunctions[ident] = 1; } var postsetId = ident + '__postset'; @@ -519,8 +524,8 @@ function JSify(data, functionsOnly, givenFunctions) { func.JS = '\n'; var paramIdents = func.params.map(function(param) { - return (param.intertype == 'varargs') ? null : toNiceIdent(param.ident); - }).filter(function(param) { return param != null; }) + return toNiceIdent(param.ident); + }); if (CLOSURE_ANNOTATIONS) { func.JS += '/**\n'; @@ -538,6 +543,34 @@ function JSify(data, functionsOnly, givenFunctions) { func.JS += 'function ' + func.ident + '(' + paramIdents.join(', ') + ') {\n'; + if (ASM_JS) { + // spell out argument types + func.params.forEach(function(param) { + func.JS += ' ' + param.ident + ' = ' + asmCoercion(param.ident, param.type) + ';\n'; + }); + + // spell out local variables + var vars = values(func.variables).filter(function(v) { return v.origin != 'funcparam' }); + if (vars.length > 0) { + var chunkSize = 8; + var chunks = []; + var i = 0; + while (i < vars.length) { + chunks.push(vars.slice(i, i+chunkSize)); + i += chunkSize; + } + for (i = 0; i < chunks.length; i++) { + func.JS += ' var ' + chunks[i].map(function(v) { + if (v.type != 'i64') { + return v.ident + ' = ' + asmInitializer(v.type); //, func.variables[v.ident].impl); + } else { + return v.ident + '$0 = 0, ' + v.ident + '$1 = 1'; + } + }).join(', ') + ';\n'; + } + } + } + if (PROFILE) { func.JS += ' if (PROFILING) { ' + 'var __parentProfilingNode__ = PROFILING_NODE; PROFILING_NODE = PROFILING_NODE.children["' + func.ident + '"]; ' @@ -547,6 +580,21 @@ function JSify(data, functionsOnly, givenFunctions) { + '}\n'; } + if (true) { // TODO: optimize away when not needed + if (CLOSURE_ANNOTATIONS) func.JS += '/** @type {number} */'; + func.JS += ' var label = 0;\n'; + } + + if (ASM_JS) { + var hasByVal = false; + func.params.forEach(function(param) { + hasByVal = hasByVal = hasByVal || param.byVal; + }); + if (hasByVal) { + func.js += ' var tempParam = 0;\n'; + } + } + // Prepare the stack, if we need one. If we have other stack allocations, force the stack to be set up. func.JS += ' ' + RuntimeGenerator.stackEnter(func.initialStack, func.otherStackAllocations) + ';\n'; @@ -561,18 +609,13 @@ function JSify(data, functionsOnly, givenFunctions) { if (param.byVal) { var type = removePointing(param.type); var typeInfo = Types.types[type]; - func.JS += ' var tempParam = ' + param.ident + '; ' + param.ident + ' = ' + RuntimeGenerator.stackAlloc(typeInfo.flatSize) + ';' + + func.JS += ' ' + (ASM_JS ? '' : 'var ') + 'tempParam = ' + param.ident + '; ' + param.ident + ' = ' + RuntimeGenerator.stackAlloc(typeInfo.flatSize) + ';' + makeCopyValues(param.ident, 'tempParam', typeInfo.flatSize, 'null', null, param.byVal) + ';\n'; } }); if (LABEL_DEBUG) func.JS += " Module.print(INDENT + ' Entering: " + func.ident + ": ' + Array.prototype.slice.call(arguments)); INDENT += ' ';\n"; - if (true) { // TODO: optimize away when not needed - if (CLOSURE_ANNOTATIONS) func.JS += '/** @type {number} */'; - func.JS += ' var label;\n'; - } - // Walk function blocks and generate JS function walkBlock(block, indent) { if (!block) return ''; @@ -703,12 +746,12 @@ function JSify(data, functionsOnly, givenFunctions) { if (PRINT_SPLIT_FILE_MARKER) { func.JS += '\n//FUNCTION_END_MARKER_OF_SOURCE_FILE_' + associatedSourceFile + '\n'; } - - if (EXPORT_ALL || (func.ident in EXPORTED_FUNCTIONS)) { + + if (!ASM_JS && (EXPORT_ALL || (func.ident in EXPORTED_FUNCTIONS))) { func.JS += 'Module["' + func.ident + '"] = ' + func.ident + ';'; } - if (INLINING_LIMIT && func.lines.length >= INLINING_LIMIT) { + if (!ASM_JS && INLINING_LIMIT && func.lines.length >= INLINING_LIMIT) { func.JS += func.ident + '["X"]=1;'; } @@ -754,8 +797,9 @@ function JSify(data, functionsOnly, givenFunctions) { var valueJS = item.JS; item.JS = ''; if (CLOSURE_ANNOTATIONS) item.JS += '/** @type {number} */ '; - item.JS += (item.overrideSSA ? '' : 'var ') + toNiceIdent(item.assignTo); - + if (!ASM_JS || item.intertype != 'alloca' || item.funcData.variables[item.assignTo].impl == VAR_EMULATED) { // asm only needs non-allocas + item.JS += ((ASM_JS || item.overrideSSA) ? '' : 'var ') + toNiceIdent(item.assignTo); + } var value = parseNumerical(valueJS); var impl = getVarImpl(item.funcData, item.assignTo); switch (impl) { @@ -785,7 +829,7 @@ function JSify(data, functionsOnly, givenFunctions) { return substrate.addActor('Intertype:' + intertype, { processItem: function(item) { item.JS = func(item); - if (!item.JS) throw "No JS generated for " + dump(item); + if (!item.JS) throw "No JS generated for " + dump((item.funcData=null,item)); if (item.assignTo) { makeAssign(item); if (!item.JS) throw "No assign JS generated for " + dump(item); @@ -801,7 +845,7 @@ function JSify(data, functionsOnly, givenFunctions) { return ';'; }); makeFuncLineActor('var', function(item) { // assigns into phis become simple vars - return 'var ' + item.ident + ';'; + return ASM_JS ? ';' : ('var ' + item.ident + ';'); }); makeFuncLineActor('store', function(item) { var value = finalizeLLVMParameter(item.value); @@ -895,7 +939,7 @@ function JSify(data, functionsOnly, givenFunctions) { var labelSets = phiSets[label]; // FIXME: Many of the |var |s here are not needed, but without them we get slowdowns with closure compiler. TODO: remove this workaround. if (labelSets.length == 1) { - return 'var ' + labelSets[0].ident + ' = ' + labelSets[0].valueJS + ';'; + return (ASM_JS ? '' : 'var ') + labelSets[0].ident + ' = ' + labelSets[0].valueJS + ';'; } // TODO: eliminate unneeded sets (to undefined etc.) var deps = {}; // for each ident we will set, which others it depends on @@ -1031,33 +1075,36 @@ function JSify(data, functionsOnly, givenFunctions) { } ret += 'return'; if (item.value) { - ret += ' ' + finalizeLLVMParameter(item.value); + ret += ' ' + asmCoercion(finalizeLLVMParameter(item.value), item.type); } return ret + ';'; }); makeFuncLineActor('resume', function(item) { // If there is no current exception, set this one as it (during a resume, the current exception can be wiped out) + var ptr = makeStructuralAccess(item.ident, 0); return (EXCEPTION_DEBUG ? 'Module.print("Resuming exception");' : '') + - 'if (' + makeGetValue('_llvm_eh_exception.buf', 0, 'void*') + ' == 0) { ' + makeSetValue('_llvm_eh_exception.buf', 0, item.ident + '.f0', 'void*') + ' } ' + - 'throw ' + item.ident + '.f0;'; + 'if (' + makeGetValue('_llvm_eh_exception.buf', 0, 'void*') + ' == 0) { ' + makeSetValue('_llvm_eh_exception.buf', 0, ptr, 'void*') + ' } ' + + 'throw ' + ptr + ';'; }); makeFuncLineActor('invoke', function(item) { // Wrapping in a function lets us easily return values if we are // in an assignment var phiSets = calcPhiSets(item); var call_ = makeFunctionCall(item.ident, item.params, item.funcData, item.type); - var ret = '(function() { try { __THREW__ = false; return ' + var ret = '(function() { try { __THREW__ = 0; return ' + call_ + ' ' + '} catch(e) { ' + 'if (typeof e != "number") throw e; ' - + 'if (ABORT) throw e; __THREW__ = true; ' + + 'if (ABORT) throw e; __THREW__ = 1; ' + (EXCEPTION_DEBUG ? 'Module.print("Exception: " + e + ", currently at: " + (new Error().stack)); ' : '') + 'return null } })();'; if (item.assignTo) { ret = 'var ' + item.assignTo + ' = ' + ret; - if (isIllegalType(item.type)) { - assert(item.type == 'i64', 'Can only handle i64 invoke among illegal invokes'); - ret += 'var ' + item.assignTo + '$0 = ' + item.assignTo + '[0], ' + item.assignTo + '$1 = ' + item.assignTo + '[1];'; + if (USE_TYPED_ARRAYS == 2 && isIllegalType(item.type)) { + var bits = getBits(item.type); + for (var i = 0; i < bits/32; i++) { + ret += 'var ' + item.assignTo + '$' + i + ' = ' + (i == 0 ? item.assignTo : 'tempRet' + (i-1)) + ';' + } } item.assignTo = null; } @@ -1085,7 +1132,12 @@ function JSify(data, functionsOnly, givenFunctions) { }); makeFuncLineActor('landingpad', function(item) { var catchTypeArray = item.catchables.map(finalizeLLVMParameter).join(','); - return '___cxa_find_matching_catch('+ makeGetValue('_llvm_eh_exception.buf', '0', 'void*') +',' + makeGetValue('_llvm_eh_exception.buf', QUANTUM_SIZE, 'void*') + ',[' + catchTypeArray +'])'; + var ret = '___cxa_find_matching_catch('+ makeGetValue('_llvm_eh_exception.buf', '0', 'void*') +',' + makeGetValue('_llvm_eh_exception.buf', QUANTUM_SIZE, 'void*') + ',[' + catchTypeArray +'])'; + if (USE_TYPED_ARRAYS == 2) { + ret = makeVarDef(item.assignTo) + '$0 = ' + ret + '; ' + item.assignTo + '$1 = tempRet0;'; + item.assignTo = null; + } + return ret; }); makeFuncLineActor('load', function(item) { var value = finalizeLLVMParameter(item.pointer); @@ -1160,6 +1212,7 @@ function JSify(data, functionsOnly, givenFunctions) { var useJSArgs = (shortident + '__jsargs') in LibraryManager.library; var hasVarArgs = isVarArgsFunctionType(type); var normalArgs = (hasVarArgs && !useJSArgs) ? countNormalArgs(type) : -1; + var byPointer = getVarData(funcData, ident); params.forEach(function(param, i) { var val = finalizeParam(param); @@ -1182,7 +1235,10 @@ function JSify(data, functionsOnly, givenFunctions) { } }); - args = args.map(function(arg, i) { return indexizeFunctions(arg, argsTypes[i]) }); + if (ASM_JS && shortident in Functions.libraryFunctions) { + args = args.map(function(arg, i) { return asmCoercion(indexizeFunctions(arg, argsTypes[i]), argsTypes[i]) }); + } + varargs = varargs.map(function(vararg, i) { if (ignoreFunctionIndexizing.indexOf(i) >= 0) return vararg; return vararg === 0 ? 0 : indexizeFunctions(vararg, varargsTypes[i]) @@ -1225,11 +1281,23 @@ function JSify(data, functionsOnly, givenFunctions) { return inline.apply(null, args); // Warning: inlining does not prevent recalculation of the arguments. They should be simple identifiers } - if (getVarData(funcData, ident)) { - ident = 'FUNCTION_TABLE[' + ident + ']'; + var returnType; + if (byPointer || ASM_JS) returnType = type.split(' ')[0]; + + if (byPointer) { + var sig = Functions.getSignature(returnType, argsTypes); + if (ASM_JS) { + assert(returnType.search(/\("'\[,/) == -1); // XXX need isFunctionType(type, out) + ident = '(' + ident + ')&{{{ FTM_' + sig + ' }}}'; // the function table mask is set in emscripten.py + } + ident = Functions.getTable(sig) + '[' + ident + ']'; } - return ident + '(' + args.join(', ') + ')'; + var ret = ident + '(' + args.join(', ') + ')'; + if (ASM_JS && shortident in Functions.libraryFunctions) { + ret = asmCoercion(ret, returnType); + } + return ret; } makeFuncLineActor('getelementptr', function(item) { return finalizeLLVMFunctionCall(item) }); makeFuncLineActor('call', function(item) { @@ -1325,8 +1393,7 @@ function JSify(data, functionsOnly, givenFunctions) { } if (phase == 'pre' || phase == 'funcs') { - // serialize out the data that later passes need - PassManager.serialize(); // XXX for funcs pass, do not serialize it all. I think we just need which were indexized. + PassManager.serialize(); return; } @@ -1353,11 +1420,11 @@ function JSify(data, functionsOnly, givenFunctions) { var postParts = processMacros(preprocess(read(postFile))).split('{{GLOBAL_VARS}}'); print(postParts[0]); - print(Functions.generateIndexing()); // done last, as it may rely on aliases set in postsets + Functions.generateIndexing(); // done last, as it may rely on aliases set in postsets // Load runtime-linked libraries RUNTIME_LINKED_LIBS.forEach(function(lib) { - print('eval(Module["read"]("' + lib + '"))(FUNCTION_TABLE.length, this);'); + print('eval(Module["read"]("' + lib + '"))(' + Functions.getTable('x') + '.length, this);'); }); print(postParts[1]); @@ -1369,6 +1436,8 @@ function JSify(data, functionsOnly, givenFunctions) { return IGNORED_FUNCTIONS.indexOf(func.ident) < 0; })) + '\n'); + PassManager.serialize(); + return null; } diff --git a/src/library.js b/src/library.js index 1bdd840d..c01b2d70 100644 --- a/src/library.js +++ b/src/library.js @@ -20,10 +20,11 @@ LibraryManager.library = { // File system base. // ========================================================================== - stdin: 0, - stdout: 0, - stderr: 0, - _impure_ptr: 0, + // keep this low in memory, because we flatten arrays with them in them + stdin: 'allocate(1, "i32*", ALLOC_STACK)', + stdout: 'allocate(1, "i32*", ALLOC_STACK)', + stderr: 'allocate(1, "i32*", ALLOC_STACK)', + _impure_ptr: 'allocate(1, "i32*", ALLOC_STACK)', $FS__deps: ['$ERRNO_CODES', '__setErrNo', 'stdin', 'stdout', 'stderr', '_impure_ptr'], $FS__postset: '__ATINIT__.unshift({ func: function() { if (!Module["noFSInit"] && !FS.init.initialized) FS.init() } });' + @@ -572,10 +573,10 @@ LibraryManager.library = { eof: false, ungotten: [] }; - // Allocate these on the stack (and never free, we are called from ATINIT or earlier), to keep their locations low - _stdin = allocate([1], 'void*', ALLOC_STACK); - _stdout = allocate([2], 'void*', ALLOC_STACK); - _stderr = allocate([3], 'void*', ALLOC_STACK); + assert(Math.max(_stdin, _stdout, _stderr) < 128); // make sure these are low, we flatten arrays with these + {{{ makeSetValue('_stdin', 0, 1, 'void*') }}}; + {{{ makeSetValue('_stdout', 0, 2, 'void*') }}}; + {{{ makeSetValue('_stderr', 0, 3, 'void*') }}}; // Other system paths FS.createPath('/', 'dev/shm/tmp', true, true); // temp files @@ -591,9 +592,9 @@ LibraryManager.library = { FS.checkStreams(); assert(FS.streams.length < 1024); // at this early stage, we should not have a large set of file descriptors - just a few #endif - __impure_ptr = allocate([ allocate( + allocate([ allocate( {{{ Runtime.QUANTUM_SIZE === 4 ? '[0, 0, 0, 0, _stdin, 0, 0, 0, _stdout, 0, 0, 0, _stderr, 0, 0, 0]' : '[0, _stdin, _stdout, _stderr]' }}}, - 'void*', ALLOC_STATIC) ], 'void*', ALLOC_STATIC); + 'void*', ALLOC_STATIC) ], 'void*', ALLOC_NONE, __impure_ptr); }, quit: function() { @@ -3616,7 +3617,9 @@ LibraryManager.library = { }, bsearch: function(key, base, num, size, compar) { - var cmp = FUNCTION_TABLE[compar]; + var cmp = function(x, y) { + return Runtime.dynCall('iii', compar, [x, y]) + }; var left = 0; var right = num; var mid, test, addr; @@ -3810,7 +3813,7 @@ LibraryManager.library = { #if USE_TYPED_ARRAYS == 2 if (bits == 64) { - ret = [{{{ splitI64('ret') }}}]; + {{{ makeStructuralReturn(splitI64('ret')) }}}; } #endif @@ -3854,11 +3857,13 @@ LibraryManager.library = { }, qsort__deps: ['memcpy'], - qsort: function(base, num, size, comparator) { + qsort: function(base, num, size, cmp) { if (num == 0 || size == 0) return; // forward calls to the JavaScript sort method // first, sort the items logically - comparator = FUNCTION_TABLE[comparator]; + var comparator = function(x, y) { + return Runtime.dynCall('iii', cmp, [x, y]); + } var keys = []; for (var i = 0; i < num; i++) keys.push(i); keys.sort(function(a, b) { @@ -3874,9 +3879,10 @@ LibraryManager.library = { _free(temp); }, - environ: null, - __environ: null, - __buildEnvironment__deps: ['environ', '__environ'], + environ: 'allocate(1, "i32*", ALLOC_STACK)', + __environ__deps: ['environ'], + __environ: '_environ', + __buildEnvironment__deps: ['__environ'], __buildEnvironment: function(env) { // WARNING: Arbitrary limit! var MAX_ENV_VALUES = 64; @@ -3885,7 +3891,8 @@ LibraryManager.library = { // Statically allocate memory for the environment. var poolPtr; var envPtr; - if (_environ === null) { + if (!___buildEnvironment.called) { + ___buildEnvironment.called = true; // Set default values. Use string keys for Closure Compiler compatibility. ENV['USER'] = 'root'; ENV['PATH'] = '/'; @@ -3898,9 +3905,7 @@ LibraryManager.library = { envPtr = allocate(MAX_ENV_VALUES * {{{ Runtime.QUANTUM_SIZE }}}, 'i8*', ALLOC_STATIC); {{{ makeSetValue('envPtr', '0', 'poolPtr', 'i8*') }}} - _environ = allocate([envPtr], 'i8**', ALLOC_STATIC); - // Set up global variable alias. - ___environ = _environ; + {{{ makeSetValue('_environ', 0, 'envPtr', 'i8*') }}}; } else { envPtr = {{{ makeGetValue('_environ', '0', 'i8**') }}}; poolPtr = {{{ makeGetValue('envPtr', '0', 'i8*') }}}; @@ -4097,14 +4102,14 @@ LibraryManager.library = { memcpy__inline: function (dest, src, num, align) { var ret = ''; #if ASSERTIONS - ret += "assert(" + num + " % 1 === 0, 'memcpy given ' + " + num + " + ' bytes to copy. Problem with quantum=1 corrections perhaps?');"; + ret += "assert(" + num + " % 1 === 0);"; //, 'memcpy given ' + " + num + " + ' bytes to copy. Problem with quantum=1 corrections perhaps?');"; #endif ret += makeCopyValues(dest, src, num, 'null', null, align); return ret; }, memcpy: function (dest, src, num, align) { #if ASSERTIONS - assert(num % 1 === 0, 'memcpy given ' + num + ' bytes to copy. Problem with quantum=1 corrections perhaps?'); + assert(num % 1 === 0); //, 'memcpy given ' + num + ' bytes to copy. Problem with quantum=1 corrections perhaps?'); #endif #if USE_TYPED_ARRAYS == 2 if (num >= {{{ SEEK_OPTIMAL_ALIGN_MIN }}} && src % 2 == dest % 2) { @@ -4716,9 +4721,8 @@ LibraryManager.library = { // ========================================================================== llvm_va_start__inline: function(ptr) { - // varargs - we received a pointer to the varargs as a final 'extra' parameter - var data = 'arguments[' + Framework.currItem.funcData.ident + '.length]'; - return makeSetValue(ptr, 0, data, 'void*'); + // varargs - we received a pointer to the varargs as a final 'extra' parameter called 'varrp' + return makeSetValue(ptr, 0, 'varrp', 'void*'); }, llvm_va_end: function() {}, @@ -4844,14 +4848,18 @@ LibraryManager.library = { return; } // Clear state flag. - __THREW__ = false; +#if ASM_JS + asm.setThrew(0); +#else + __THREW__ = 0; +#endif // Clear type. {{{ makeSetValue('_llvm_eh_exception.buf', QUANTUM_SIZE, '0', 'void*') }}} // Call destructor if one is registered then clear it. var ptr = {{{ makeGetValue('_llvm_eh_exception.buf', '0', 'void*') }}}; var destructor = {{{ makeGetValue('_llvm_eh_exception.buf', 2 * QUANTUM_SIZE, 'void*') }}}; if (destructor) { - FUNCTION_TABLE[destructor](ptr); + Runtime.dynCall('vi', destructor, [ptr]); {{{ makeSetValue('_llvm_eh_exception.buf', 2 * QUANTUM_SIZE, '0', 'i32') }}} } // Free ptr if it isn't null. @@ -4933,12 +4941,12 @@ LibraryManager.library = { // return the type of the catch block which should be called. for (var i = 0; i < typeArray.length; i++) { if (___cxa_does_inherit(typeArray[i], throwntype, thrown)) - return { f0:thrown, f1:typeArray[i] }; + {{{ makeStructuralReturn(['thrown', 'typeArray[i]']) }}}; } // Shouldn't happen unless we have bogus data in typeArray // or encounter a type for which emscripten doesn't have suitable // typeinfo defined. Best-efforts match just in case. - return { f0:thrown, f1 :throwntype }; + {{{ makeStructuralReturn(['thrown', 'throwntype']) }}}; }, // Recursively walks up the base types of 'possibilityType' @@ -5004,73 +5012,51 @@ LibraryManager.library = { llvm_uadd_with_overflow_i8: function(x, y) { x = x & 0xff; y = y & 0xff; - return { - f0: (x+y) & 0xff, - f1: x+y > 255 - }; + {{{ makeStructuralReturn(['(x+y) & 0xff', 'x+y > 255']) }}}; }, llvm_umul_with_overflow_i8: function(x, y) { x = x & 0xff; y = y & 0xff; - return { - f0: (x*y) & 0xff, - f1: x*y > 255 - }; + {{{ makeStructuralReturn(['(x*y) & 0xff', 'x*y > 255']) }}}; }, llvm_uadd_with_overflow_i16: function(x, y) { x = x & 0xffff; y = y & 0xffff; - return { - f0: (x+y) & 0xffff, - f1: x+y > 65535 - }; + {{{ makeStructuralReturn(['(x+y) & 0xffff', 'x+y > 65535']) }}}; }, llvm_umul_with_overflow_i16: function(x, y) { x = x & 0xffff; y = y & 0xffff; - return { - f0: (x*y) & 0xffff, - f1: x*y > 65535 - }; + {{{ makeStructuralReturn(['(x*y) & 0xffff', 'x*y > 65535']) }}}; }, llvm_uadd_with_overflow_i32: function(x, y) { x = x>>>0; y = y>>>0; - return { - f0: (x+y)>>>0, - f1: x+y > 4294967295 - }; + {{{ makeStructuralReturn(['(x+y)>>>0', 'x+y > 4294967295']) }}}; }, llvm_umul_with_overflow_i32: function(x, y) { x = x>>>0; y = y>>>0; - return { - f0: (x*y)>>>0, - f1: x*y > 4294967295 - }; + {{{ makeStructuralReturn(['(x*y)>>>0', 'x*y > 4294967295']) }}}; }, llvm_uadd_with_overflow_i64__deps: [function() { Types.preciseI64MathUsed = 1 }], llvm_uadd_with_overflow_i64: function(xl, xh, yl, yh) { i64Math.add(xl, xh, yl, yh); - return { - f0: i64Math.result, - f1: 0 // XXX Need to hack support for this in long.js - }; + {{{ makeStructuralReturn(['HEAP32[tempDoublePtr>>2]', 'HEAP32[tempDoublePtr+4>>2]', '0']) }}}; + // XXX Need to hack support for second param in long.js }, llvm_umul_with_overflow_i64__deps: [function() { Types.preciseI64MathUsed = 1 }], llvm_umul_with_overflow_i64: function(xl, xh, yl, yh) { - i64Math.mul(xl, xh, yl, yh); - return { - f0: i64Math.result, - f1: 0 // XXX Need to hack support for this in long.js - }; + i64Math.multiply(xl, xh, yl, yh); + {{{ makeStructuralReturn(['HEAP32[tempDoublePtr>>2]', 'HEAP32[tempDoublePtr+4>>2]', '0']) }}}; + // XXX Need to hack support for second param in long.js }, llvm_stacksave: function() { @@ -5510,7 +5496,7 @@ LibraryManager.library = { } try { - var lib_module = eval(lib_data)(FUNCTION_TABLE.length); + var lib_module = eval(lib_data)({{{ Functions.getTable('x') }}}.length); } catch (e) { #if ASSERTIONS Module.printErr('Error in loading dynamic library: ' + e); @@ -5583,9 +5569,9 @@ LibraryManager.library = { } else { var result = lib.module[symbol]; if (typeof result == 'function') { - FUNCTION_TABLE.push(result); - FUNCTION_TABLE.push(0); - result = FUNCTION_TABLE.length - 2; + {{{ Functions.getTable('x') }}}.push(result); + {{{ Functions.getTable('x') }}}.push(0); + result = {{{ Functions.getTable('x') }}}.length - 2; lib.cached_functions = result; } return result; @@ -5653,11 +5639,11 @@ LibraryManager.library = { 'tm_gmtoff', 'tm_zone'], '%struct.tm'), // Statically allocated time struct. - __tm_current: 0, + __tm_current: 'allocate({{{ Runtime.QUANTUM_SIZE }}}*26, "i8", ALLOC_STACK)', // Statically allocated timezone strings. __tm_timezones: {}, // Statically allocated time strings. - __tm_formatted: 0, + __tm_formatted: 'allocate({{{ Runtime.QUANTUM_SIZE }}}*26, "i8", ALLOC_STACK)', mktime__deps: ['__tm_struct_layout', 'tzset'], mktime: function(tmPtr) { @@ -5680,7 +5666,6 @@ LibraryManager.library = { gmtime__deps: ['malloc', '__tm_struct_layout', '__tm_current', 'gmtime_r'], gmtime: function(time) { - if (!___tm_current) ___tm_current = _malloc(___tm_struct_layout.__size__); return _gmtime_r(time, ___tm_current); }, @@ -5723,7 +5708,6 @@ LibraryManager.library = { localtime__deps: ['malloc', '__tm_struct_layout', '__tm_current', 'localtime_r'], localtime: function(time) { - if (!___tm_current) ___tm_current = _malloc(___tm_struct_layout.__size__); return _localtime_r(time, ___tm_current); }, @@ -5759,7 +5743,6 @@ LibraryManager.library = { asctime__deps: ['malloc', '__tm_formatted', 'asctime_r'], asctime: function(tmPtr) { - if (!___tm_formatted) ___tm_formatted = _malloc(26); return _asctime_r(tmPtr, ___tm_formatted); }, @@ -5794,18 +5777,17 @@ LibraryManager.library = { // TODO: Initialize these to defaults on startup from system settings. // Note: glibc has one fewer underscore for all of these. Also used in other related functions (timegm) - _tzname: null, - _daylight: null, - _timezone: null, + _tzname: 'allocate({{{ 2*Runtime.QUANTUM_SIZE }}}, "i32*", ALLOC_STACK)', + _daylight: 'allocate(1, "i32*", ALLOC_STACK)', + _timezone: 'allocate(1, "i32*", ALLOC_STACK)', tzset__deps: ['_tzname', '_daylight', '_timezone'], tzset: function() { // TODO: Use (malleable) environment variables instead of system settings. - if (__tzname) return; // glibc does not need the double __ + if (_tzset.called) return; + _tzset.called = true; - __timezone = _malloc({{{ Runtime.QUANTUM_SIZE }}}); {{{ makeSetValue('__timezone', '0', '-(new Date()).getTimezoneOffset() * 60', 'i32') }}} - __daylight = _malloc({{{ Runtime.QUANTUM_SIZE }}}); var winter = new Date(2000, 0, 1); var summer = new Date(2000, 6, 1); {{{ makeSetValue('__daylight', '0', 'Number(winter.getTimezoneOffset() != summer.getTimezoneOffset())', 'i32') }}} @@ -5814,7 +5796,6 @@ LibraryManager.library = { var summerName = 'GMT'; // XXX do not rely on browser timezone info, it is very unpredictable | summer.toString().match(/\(([A-Z]+)\)/)[1]; var winterNamePtr = allocate(intArrayFromString(winterName), 'i8', ALLOC_NORMAL); var summerNamePtr = allocate(intArrayFromString(summerName), 'i8', ALLOC_NORMAL); - __tzname = _malloc(2 * {{{ Runtime.QUANTUM_SIZE }}}); // glibc does not need the double __ {{{ makeSetValue('__tzname', '0', 'winterNamePtr', 'i32') }}} {{{ makeSetValue('__tzname', Runtime.QUANTUM_SIZE, 'summerNamePtr', 'i32') }}} }, @@ -6014,6 +5995,8 @@ LibraryManager.library = { return 0; }, + freelocale: function(locale) {}, + uselocale: function(locale) { return 0; }, @@ -6453,6 +6436,8 @@ LibraryManager.library = { pthread_mutexattr_destroy: function() {}, pthread_mutex_lock: function() {}, pthread_mutex_unlock: function() {}, + pthread_cond_init: function() {}, + pthread_cond_destroy: function() {}, pthread_cond_broadcast: function() {}, pthread_self: function() { //FIXME: assumes only a single thread @@ -6486,7 +6471,7 @@ LibraryManager.library = { pthread_once: function(ptr, func) { if (!_pthread_once.seen) _pthread_once.seen = {}; if (ptr in _pthread_once.seen) return; - FUNCTION_TABLE[func](); + Runtime.dynCall('v', func); _pthread_once.seen[ptr] = 1; }, @@ -6504,7 +6489,7 @@ LibraryManager.library = { }, pthread_cleanup_push: function(routine, arg) { - __ATEXIT__.push({ func: function() { FUNCTION_TABLE[routine](arg) } }) + __ATEXIT__.push({ func: function() { Runtime.dynCall('vi', routine, [arg]) } }) _pthread_cleanup_push.level = __ATEXIT__.length; }, diff --git a/src/library_browser.js b/src/library_browser.js index 00ee158c..21bad254 100644 --- a/src/library_browser.js +++ b/src/library_browser.js @@ -377,10 +377,10 @@ mergeInto(LibraryManager.library, { _file.substr(index +1), _url, true, true, function() { - if (onload) FUNCTION_TABLE[onload](file); + if (onload) Runtime.dynCall('vi', onload, [file]); }, function() { - if (onerror) FUNCTION_TABLE[onerror](file); + if (onerror) Runtime.dynCall('vi', onerror, [file]); } ); }, @@ -395,10 +395,10 @@ mergeInto(LibraryManager.library, { _file.substr(index +1), new Uint8Array(data.object.contents), true, true, function() { - if (onload) FUNCTION_TABLE[onload](file); + if (onload) Runtime.dynCall('vi', onload, [file]); }, function() { - if (onerror) FUNCTION_TABLE[onerror](file); + if (onerror) Runtime.dynCall('vi', onerror, [file]); }, true // don'tCreateFile - it's already there ); @@ -417,10 +417,10 @@ mergeInto(LibraryManager.library, { {{{ makeHEAPView('U8', 'data', 'data + size') }}}, true, true, function() { - if (onload) FUNCTION_TABLE[onload](arg, cname); + if (onload) Runtime.dynCall('vii', onload, [file, cname]); }, function() { - if (onerror) FUNCTION_TABLE[onerror](arg); + if (onerror) Runtime.dynCall('vi', onerror, [file]); }, true // don'tCreateFile - it's already there ); @@ -440,7 +440,6 @@ mergeInto(LibraryManager.library, { emscripten_set_main_loop: function(func, fps, simulateInfiniteLoop) { Module['noExitRuntime'] = true; - var jsFunc = FUNCTION_TABLE[func]; Browser.mainLoop.runner = function() { if (Browser.mainLoop.queue.length > 0) { var start = Date.now(); @@ -473,7 +472,7 @@ mergeInto(LibraryManager.library, { Module['preMainLoop'](); } - jsFunc(); + Runtime.dynCall('v', func); if (Module['postMainLoop']) { Module['postMainLoop'](); @@ -517,12 +516,16 @@ mergeInto(LibraryManager.library, { }, _emscripten_push_main_loop_blocker: function(func, arg, name) { - Browser.mainLoop.queue.push({ func: FUNCTION_TABLE[func], arg: arg, name: Pointer_stringify(name), counted: true }); + Browser.mainLoop.queue.push({ func: function() { + Runtime.dynCall('vi', func, [arg]); + }, name: Pointer_stringify(name), counted: true }); Browser.mainLoop.updateStatus(); }, _emscripten_push_uncounted_main_loop_blocker: function(func, arg, name) { - Browser.mainLoop.queue.push({ func: FUNCTION_TABLE[func], arg: arg, name: Pointer_stringify(name), counted: false }); + Browser.mainLoop.queue.push({ func: function() { + Runtime.dynCall('vi', func, [arg]); + }, name: Pointer_stringify(name), counted: false }); Browser.mainLoop.updateStatus(); }, diff --git a/src/library_gc.js b/src/library_gc.js index a06e2f01..fe4cbf63 100644 --- a/src/library_gc.js +++ b/src/library_gc.js @@ -1,5 +1,7 @@ if (GC_SUPPORT) { + EXPORTED_FUNCTIONS['_calloc'] = 1; + var LibraryGC = { $GC__deps: ['sbrk'], $GC: { @@ -50,7 +52,7 @@ if (GC_SUPPORT) { free: function(ptr) { // does not check if anything refers to it, this is a forced free var finalizer = GC.finalizers[ptr]; if (finalizer) { - Runtime.getFuncWrapper(finalizer)(ptr, GC.finalizerArgs[ptr]); + Runtime.getFuncWrapper(finalizer, 'vii')(ptr, GC.finalizerArgs[ptr]); GC.finalizers[ptr] = 0; } _free(ptr); diff --git a/src/library_gl.js b/src/library_gl.js index b4098813..6927c3ec 100644 --- a/src/library_gl.js +++ b/src/library_gl.js @@ -1275,11 +1275,12 @@ var LibraryGL = { getProcAddress: function(name) { name = name.replace('EXT', '').replace('ARB', ''); // Do the translation carefully because of closure + var sig = ''; switch (name) { - case 'glCreateShaderObject': case 'glCreateShader': func = _glCreateShader; break; - case 'glCreateProgramObject': case 'glCreateProgram': func = _glCreateProgram; break; - case 'glAttachObject': case 'glAttachShader': func = _glAttachShader; break; - case 'glUseProgramObject': case 'glUseProgram': func = _glUseProgram; break; + case 'glCreateShaderObject': case 'glCreateShader': func = _glCreateShader; sig = 'ii'; break; + case 'glCreateProgramObject': case 'glCreateProgram': func = _glCreateProgram; sig = 'ii'; break; + case 'glAttachObject': case 'glAttachShader': func = _glAttachShader; sig = 'vi'; break; + case 'glUseProgramObject': case 'glUseProgram': func = _glUseProgram; sig = 'vi'; break; case 'glDeleteObject': func = function(id) { if (GL.programs[id]) { _glDeleteProgram(id); @@ -1288,7 +1289,7 @@ var LibraryGL = { } else { Module.printErr('WARNING: deleteObject received invalid id: ' + id); } - }; break; + }; sig = 'vi'; break; case 'glGetObjectParameteriv': func = function(id, type, result) { if (GL.programs[id]) { if (type == 0x8B84) { // GL_OBJECT_INFO_LOG_LENGTH_ARB @@ -1305,7 +1306,7 @@ var LibraryGL = { } else { Module.printErr('WARNING: getObjectParameteriv received invalid id: ' + id); } - }; break; + }; sig = 'viii'; break; case 'glGetInfoLog': func = function(id, maxLength, length, infoLog) { if (GL.programs[id]) { _glGetProgramInfoLog(id, maxLength, length, infoLog); @@ -1314,58 +1315,58 @@ var LibraryGL = { } else { Module.printErr('WARNING: getObjectParameteriv received invalid id: ' + id); } - }; break; + }; sig = 'viiii'; break; case 'glBindProgram': func = function(type, id) { assert(id == 0); - }; break; - case 'glDrawRangeElements': func = _glDrawRangeElements; break; - case 'glShaderSource': func = _glShaderSource; break; - case 'glCompileShader': func = _glCompileShader; break; - case 'glLinkProgram': func = _glLinkProgram; break; - case 'glGetUniformLocation': func = _glGetUniformLocation; break; - case 'glUniform1f': func = _glUniform1f; break; - case 'glUniform2f': func = _glUniform2f; break; - case 'glUniform3f': func = _glUniform3f; break; - case 'glUniform4f': func = _glUniform4f; break; - case 'glUniform1fv': func = _glUniform1fv; break; - case 'glUniform2fv': func = _glUniform2fv; break; - case 'glUniform3fv': func = _glUniform3fv; break; - case 'glUniform4fv': func = _glUniform4fv; break; - case 'glUniform1i': func = _glUniform1i; break; - case 'glUniform2i': func = _glUniform2i; break; - case 'glUniform3i': func = _glUniform3i; break; - case 'glUniform4i': func = _glUniform4i; break; - case 'glUniform1iv': func = _glUniform1iv; break; - case 'glUniform2iv': func = _glUniform2iv; break; - case 'glUniform3iv': func = _glUniform3iv; break; - case 'glUniform4iv': func = _glUniform4iv; break; - case 'glBindAttribLocation': func = _glBindAttribLocation; break; - case 'glGetActiveUniform': func = _glGetActiveUniform; break; - case 'glGenBuffers': func = _glGenBuffers; break; - case 'glBindBuffer': func = _glBindBuffer; break; - case 'glBufferData': func = _glBufferData; break; - case 'glBufferSubData': func = _glBufferSubData; break; - case 'glDeleteBuffers': func = _glDeleteBuffers; break; - case 'glActiveTexture': func = _glActiveTexture; break; - case 'glClientActiveTexture': func = _glClientActiveTexture; break; - case 'glGetProgramiv': func = _glGetProgramiv; break; - case 'glEnableVertexAttribArray': func = _glEnableVertexAttribArray; break; - case 'glDisableVertexAttribArray': func = _glDisableVertexAttribArray; break; - case 'glVertexAttribPointer': func = _glVertexAttribPointer; break; - case 'glBindRenderbuffer': func = _glBindRenderbuffer; break; - case 'glDeleteRenderbuffers': func = _glDeleteRenderbuffers; break; - case 'glGenRenderbuffers': func = _glGenRenderbuffers; break; - case 'glCompressedTexImage2D': func = _glCompressedTexImage2D; break; - case 'glCompressedTexSubImage2D': func = _glCompressedTexSubImage2D; break; - case 'glBindFramebuffer': func = _glBindFramebuffer; break; - case 'glGenFramebuffers': func = _glGenFramebuffers; break; - case 'glDeleteFramebuffers': func = _glDeleteFramebuffers; break; - case 'glFramebufferRenderbuffer': func = _glFramebufferRenderbuffer; break; - case 'glFramebufferTexture2D': func = _glFramebufferTexture2D; break; - case 'glGetFramebufferAttachmentParameteriv': func = _glGetFramebufferAttachmentParameteriv; break; - case 'glIsFramebuffer': func = _glIsFramebuffer; break; - case 'glCheckFramebufferStatus': func = _glCheckFramebufferStatus; break; - case 'glRenderbufferStorage': func = _glRenderbufferStorage; break; + }; sig = 'vii'; break; + case 'glDrawRangeElements': func = _glDrawRangeElements; sig = 'viiiiii'; break; + case 'glShaderSource': func = _glShaderSource; sig = 'viiii'; break; + case 'glCompileShader': func = _glCompileShader; sig = 'vi'; break; + case 'glLinkProgram': func = _glLinkProgram; sig = 'vi'; break; + case 'glGetUniformLocation': func = _glGetUniformLocation; sig = 'iii'; break; + case 'glUniform1f': func = _glUniform1f; sig = 'vid'; break; + case 'glUniform2f': func = _glUniform2f; sig = 'vidd'; break; + case 'glUniform3f': func = _glUniform3f; sig = 'viddd'; break; + case 'glUniform4f': func = _glUniform4f; sig = 'vidddd'; break; + case 'glUniform1fv': func = _glUniform1fv; sig = 'viii'; break; + case 'glUniform2fv': func = _glUniform2fv; sig = 'viii'; break; + case 'glUniform3fv': func = _glUniform3fv; sig = 'viii'; break; + case 'glUniform4fv': func = _glUniform4fv; sig = 'viii'; break; + case 'glUniform1i': func = _glUniform1i; sig = 'vii'; break; + case 'glUniform2i': func = _glUniform2i; sig = 'viii'; break; + case 'glUniform3i': func = _glUniform3i; sig = 'viiii'; break; + case 'glUniform4i': func = _glUniform4i; sig = 'viiii'; break; + case 'glUniform1iv': func = _glUniform1iv; sig = 'viii'; break; + case 'glUniform2iv': func = _glUniform2iv; sig = 'viii'; break; + case 'glUniform3iv': func = _glUniform3iv; sig = 'viii'; break; + case 'glUniform4iv': func = _glUniform4iv; sig = 'viii'; break; + case 'glBindAttribLocation': func = _glBindAttribLocation; sig = 'viii'; break; + case 'glGetActiveUniform': func = _glGetActiveUniform; sig = 'viiiiiii'; break; + case 'glGenBuffers': func = _glGenBuffers; sig = 'iii'; break; + case 'glBindBuffer': func = _glBindBuffer; sig = 'vii'; break; + case 'glBufferData': func = _glBufferData; sig = 'viiii'; break; + case 'glBufferSubData': func = _glBufferSubData; sig = 'viiii'; break; + case 'glDeleteBuffers': func = _glDeleteBuffers; sig = 'vii'; break; + case 'glActiveTexture': func = _glActiveTexture; sig = 'vi'; break; + case 'glClientActiveTexture': func = _glClientActiveTexture; sig = 'vi'; break; + case 'glGetProgramiv': func = _glGetProgramiv; sig = 'viii'; break; + case 'glEnableVertexAttribArray': func = _glEnableVertexAttribArray; sig = 'vi'; break; + case 'glDisableVertexAttribArray': func = _glDisableVertexAttribArray; sig = 'vi'; break; + case 'glVertexAttribPointer': func = _glVertexAttribPointer; sig = 'viiiiii'; break; + case 'glBindRenderbuffer': func = _glBindRenderbuffer; sig = 'vii'; break; + case 'glDeleteRenderbuffers': func = _glDeleteRenderbuffers; sig = 'vii'; break; + case 'glGenRenderbuffers': func = _glGenRenderbuffers; sig = 'vii'; break; + case 'glCompressedTexImage2D': func = _glCompressedTexImage2D; sig = 'viiiiiiii'; break; + case 'glCompressedTexSubImage2D': func = _glCompressedTexSubImage2D; sig = 'viiiiiiiii'; break; + case 'glBindFramebuffer': func = _glBindFramebuffer; sig = 'vii'; break; + case 'glGenFramebuffers': func = _glGenFramebuffers; sig = 'vii'; break; + case 'glDeleteFramebuffers': func = _glDeleteFramebuffers; sig = 'vii'; break; + case 'glFramebufferRenderbuffer': func = _glFramebufferRenderbuffer; sig = 'viiii'; break; + case 'glFramebufferTexture2D': func = _glFramebufferTexture2D; sig = 'viiiii'; break; + case 'glGetFramebufferAttachmentParameteriv': func = _glGetFramebufferAttachmentParameteriv; sig = 'viiii'; break; + case 'glIsFramebuffer': func = _glIsFramebuffer; sig = 'ii'; break; + case 'glCheckFramebufferStatus': func = _glCheckFramebufferStatus; sig = 'ii'; break; + case 'glRenderbufferStorage': func = _glRenderbufferStorage; sig = 'viiii'; break; default: { Module.printErr('WARNING: getProcAddress failed for ' + name); func = function() { @@ -1374,7 +1375,7 @@ var LibraryGL = { }; } } - return Runtime.addFunction(func); + return Runtime.addFunction(func, sig); } }, diff --git a/src/library_glut.js b/src/library_glut.js index 6069b484..0994df34 100644 --- a/src/library_glut.js +++ b/src/library_glut.js @@ -54,11 +54,11 @@ var LibraryGLUT = { if (GLUT.buttons == 0 && event.target == Module["canvas"] && GLUT.passiveMotionFunc) { event.preventDefault(); GLUT.saveModifiers(event); - FUNCTION_TABLE[GLUT.passiveMotionFunc](GLUT.lastX, GLUT.lastY); + Runtime.dynCall('vii', GLUT.passiveMotionFunc, [GLUT.lastX, GLUT.lastY]); } else if (GLUT.buttons != 0 && GLUT.motionFunc) { event.preventDefault(); GLUT.saveModifiers(event); - FUNCTION_TABLE[GLUT.motionFunc](GLUT.lastX, GLUT.lastY); + Runtime.dynCall('vii', GLUT.motionFunc, [GLUT.lastX, GLUT.lastY]); } }, @@ -159,7 +159,7 @@ var LibraryGLUT = { if( GLUT.specialFunc ) { event.preventDefault(); GLUT.saveModifiers(event); - FUNCTION_TABLE[GLUT.specialFunc](key, GLUT.lastX, GLUT.lastY); + Runtime.dynCall('viii', GLUT.specialFunc, [key, GLUT.lastX, GLUT.lastY]); } } else @@ -168,7 +168,7 @@ var LibraryGLUT = { if( key !== null && GLUT.keyboardFunc ) { event.preventDefault(); GLUT.saveModifiers(event); - FUNCTION_TABLE[GLUT.keyboardFunc](key, GLUT.lastX, GLUT.lastY); + Runtime.dynCall('viii', GLUT.keyboardFunc, [key, GLUT.lastX, GLUT.lastY]); } } } @@ -181,7 +181,7 @@ var LibraryGLUT = { if(GLUT.specialUpFunc) { event.preventDefault (); GLUT.saveModifiers(event); - FUNCTION_TABLE[GLUT.specialUpFunc](key, GLUT.lastX, GLUT.lastY); + Runtime.dynCall('viii', GLUT.specialUpFunc, key, [GLUT.lastX, GLUT.lastY]); } } else @@ -190,7 +190,7 @@ var LibraryGLUT = { if( key !== null && GLUT.keyboardUpFunc ) { event.preventDefault (); GLUT.saveModifiers(event); - FUNCTION_TABLE[GLUT.keyboardUpFunc](key, GLUT.lastX, GLUT.lastY); + Runtime.dynCall('viii', GLUT.keyboardUpFunc, [key, GLUT.lastX, GLUT.lastY]); } } } @@ -206,7 +206,7 @@ var LibraryGLUT = { } catch (e) {} event.preventDefault(); GLUT.saveModifiers(event); - FUNCTION_TABLE[GLUT.mouseFunc](event['button'], 0/*GLUT_DOWN*/, GLUT.lastX, GLUT.lastY); + Runtime.dynCall('viiii', GLUT.mouseFunc, [event['button'], 0/*GLUT_DOWN*/, GLUT.lastX, GLUT.lastY]); } }, @@ -217,7 +217,7 @@ var LibraryGLUT = { if(GLUT.mouseFunc) { event.preventDefault(); GLUT.saveModifiers(event); - FUNCTION_TABLE[GLUT.mouseFunc](event['button'], 1/*GLUT_UP*/, GLUT.lastX, GLUT.lastY); + Runtime.dynCal('viiii', GLUT.mouseFunc, [event['button'], 1/*GLUT_UP*/, GLUT.lastX, GLUT.lastY]); } }, @@ -241,7 +241,7 @@ var LibraryGLUT = { /* Can't call _glutReshapeWindow as that requests cancelling fullscreen. */ if (GLUT.reshapeFunc) { // console.log("GLUT.reshapeFunc (from FS): " + width + ", " + height); - FUNCTION_TABLE[GLUT.reshapeFunc](width, height); + Runtime.dynCall('vii', GLUT.reshapeFunc, [width, height]); } _glutPostRedisplay(); }, @@ -326,7 +326,7 @@ var LibraryGLUT = { glutIdleFunc: function(func) { var callback = function() { if (GLUT.idleFunc) { - FUNCTION_TABLE[GLUT.idleFunc](); + Runtime.dynCall('v', GLUT.idleFunc); window.setTimeout(callback, 0); } } @@ -336,7 +336,7 @@ var LibraryGLUT = { }, glutTimerFunc: function(msec, func, value) { - window.setTimeout(function() { FUNCTION_TABLE[func](value); }, msec); + window.setTimeout(function() { Runtime.dynCall('vi', func, [value]); }, msec); }, glutDisplayFunc: function(func) { @@ -388,7 +388,7 @@ var LibraryGLUT = { Browser.setCanvasSize(width, height); if (GLUT.reshapeFunc) { // console.log("GLUT.reshapeFunc: " + width + ", " + height); - FUNCTION_TABLE[GLUT.reshapeFunc](width, height); + Runtime.dynCall('vii', GLUT.reshapeFunc, [width, height]); } _glutPostRedisplay(); }, @@ -417,7 +417,9 @@ var LibraryGLUT = { glutPostRedisplay: function() { if (GLUT.displayFunc) { - Browser.requestAnimationFrame(FUNCTION_TABLE[GLUT.displayFunc]); + Browser.requestAnimationFrame(function() { + Runtime.dynCall('vi', GLUT.displayFunc); + }); } }, diff --git a/src/library_sdl.js b/src/library_sdl.js index 0969f738..6f1ed32b 100644 --- a/src/library_sdl.js +++ b/src/library_sdl.js @@ -1116,7 +1116,7 @@ var LibrarySDL = { SDL.audio.bufferSize = totalSamples*2; // hardcoded 16-bit audio SDL.audio.buffer = _malloc(SDL.audio.bufferSize); SDL.audio.caller = function() { - FUNCTION_TABLE[SDL.audio.callback](SDL.audio.userdata, SDL.audio.buffer, SDL.audio.bufferSize); + Runtime.dynCall('viii', SDL.audio.callback, [SDL.audio.userdata, SDL.audio.buffer, SDL.audio.bufferSize]); SDL.audio.pushAudio(SDL.audio.buffer, SDL.audio.bufferSize); }; // Mozilla Audio API. TODO: Other audio APIs @@ -1408,7 +1408,7 @@ var LibrarySDL = { audio.pause(); SDL.music.audio = null; if (SDL.hookMusicFinished) { - FUNCTION_TABLE[SDL.hookMusicFinished](); + Runtime.dynCall('v', SDL.hookMusicFinished); } return 0; }, @@ -1439,6 +1439,10 @@ var LibrarySDL = { return id; }, + TTF_CloseFont: function(font) { + SDL.fonts[font] = null; + }, + TTF_RenderText_Solid: function(font, text, color) { // XXX the font and color are ignored text = Pointer_stringify(text) || ' '; // if given an empty string, still return a valid surface @@ -1551,7 +1555,7 @@ var LibrarySDL = { SDL_AddTimer: function(interval, callback, param) { return window.setTimeout(function() { - FUNCTION_TABLE[callback](interval, param); + Runtime.dynCall('ii', callback, [interval, param]); }, interval); }, SDL_RemoveTimer: function(id) { diff --git a/src/long.js b/src/long.js index d5770e48..865540db 100644 --- a/src/long.js +++ b/src/long.js @@ -1530,27 +1530,26 @@ var i64Math = (function() { // Emscripten wrapper // Emscripten wrapper var Wrapper = { - result: [0, 0], // return result stored here add: function(xl, xh, yl, yh) { var x = new goog.math.Long(xl, xh); var y = new goog.math.Long(yl, yh); var ret = x.add(y); - Wrapper.result[0] = ret.low_; - Wrapper.result[1] = ret.high_; + HEAP32[tempDoublePtr>>2] = ret.low_; + HEAP32[tempDoublePtr+4>>2] = ret.high_; }, subtract: function(xl, xh, yl, yh) { var x = new goog.math.Long(xl, xh); var y = new goog.math.Long(yl, yh); var ret = x.subtract(y); - Wrapper.result[0] = ret.low_; - Wrapper.result[1] = ret.high_; + HEAP32[tempDoublePtr>>2] = ret.low_; + HEAP32[tempDoublePtr+4>>2] = ret.high_; }, multiply: function(xl, xh, yl, yh) { var x = new goog.math.Long(xl, xh); var y = new goog.math.Long(yl, yh); var ret = x.multiply(y); - Wrapper.result[0] = ret.low_; - Wrapper.result[1] = ret.high_; + HEAP32[tempDoublePtr>>2] = ret.low_; + HEAP32[tempDoublePtr+4>>2] = ret.high_; }, makeTwo32: function() { Wrapper.two32 = new BigInteger(); @@ -1573,8 +1572,8 @@ var i64Math = (function() { // Emscripten wrapper var x = new goog.math.Long(xl, xh); var y = new goog.math.Long(yl, yh); var ret = x.div(y); - Wrapper.result[0] = ret.low_; - Wrapper.result[1] = ret.high_; + HEAP32[tempDoublePtr>>2] = ret.low_; + HEAP32[tempDoublePtr+4>>2] = ret.high_; } else { // slow precise bignum division var x = Wrapper.lh2bignum(xl >>> 0, xh >>> 0); @@ -1584,8 +1583,8 @@ var i64Math = (function() { // Emscripten wrapper var l = new BigInteger(); var h = new BigInteger(); z.divRemTo(Wrapper.two32, h, l); - Wrapper.result[0] = parseInt(l.toString()) | 0; - Wrapper.result[1] = parseInt(h.toString()) | 0; + HEAP32[tempDoublePtr>>2] = parseInt(l.toString()) | 0; + HEAP32[tempDoublePtr+4>>2] = parseInt(h.toString()) | 0; } }, modulo: function(xl, xh, yl, yh, unsigned) { @@ -1594,8 +1593,8 @@ var i64Math = (function() { // Emscripten wrapper var x = new goog.math.Long(xl, xh); var y = new goog.math.Long(yl, yh); var ret = x.modulo(y); - Wrapper.result[0] = ret.low_; - Wrapper.result[1] = ret.high_; + HEAP32[tempDoublePtr>>2] = ret.low_; + HEAP32[tempDoublePtr+4>>2] = ret.high_; } else { // slow precise bignum division var x = Wrapper.lh2bignum(xl >>> 0, xh >>> 0); @@ -1605,8 +1604,8 @@ var i64Math = (function() { // Emscripten wrapper var l = new BigInteger(); var h = new BigInteger(); z.divRemTo(Wrapper.two32, h, l); - Wrapper.result[0] = parseInt(l.toString()) | 0; - Wrapper.result[1] = parseInt(h.toString()) | 0; + HEAP32[tempDoublePtr>>2] = parseInt(l.toString()) | 0; + HEAP32[tempDoublePtr+4>>2] = parseInt(h.toString()) | 0; } }, stringify: function(l, h, unsigned) { diff --git a/src/modules.js b/src/modules.js index fd0ec35e..5c1d6a1d 100644 --- a/src/modules.js +++ b/src/modules.js @@ -216,14 +216,26 @@ var Types = { }; var Functions = { - // All functions that will be implemented in this file + // All functions that will be implemented in this file. Maps id to signature implementedFunctions: {}, + libraryFunctions: {}, // functions added from the library + unimplementedFunctions: {}, // library etc. functions that we need to index, maps id to signature indexedFunctions: {}, nextIndex: 2, // Start at a non-0 (even, see below) value blockAddresses: {}, // maps functions to a map of block labels to label ids + getSignature: function(returnType, argTypes) { + var sig = returnType == 'void' ? 'v' : (isIntImplemented(returnType) ? 'i' : 'f'); + for (var i = 0; i < argTypes.length; i++) { + var type = argTypes[i]; + if (!type) break; // varargs + sig += isIntImplemented(type) ? (getBits(type) == 64 ? 'ii' : 'i') : 'f'; // legalized i64s will be i32s + } + return sig; + }, + // Mark a function as needing indexing. Python will coordinate them all getIndex: function(ident) { if (phase != 'post') { @@ -240,27 +252,53 @@ var Functions = { } }, + getTable: function(sig) { + return ASM_JS ? 'FUNCTION_TABLE_' + sig : 'FUNCTION_TABLE'; + }, + // Generate code for function indexing generateIndexing: function() { - var vals = zeros(this.nextIndex); + var total = this.nextIndex; + if (ASM_JS) total = ceilPowerOfTwo(total); // must be power of 2 for mask + function emptyTable(sig) { + return zeros(total); + } + var tables = {}; + if (ASM_JS) { + ['v', 'vi', 'ii', 'iii'].forEach(function(sig) { // add some default signatures that are used in the library + tables[sig] = emptyTable(sig); // TODO: make them compact + }); + } for (var ident in this.indexedFunctions) { - vals[this.indexedFunctions[ident]] = ident; + var sig = ASM_JS ? Functions.implementedFunctions[ident] || Functions.unimplementedFunctions[ident] : 'x'; + assert(sig, ident); + if (!tables[sig]) tables[sig] = emptyTable(sig); // TODO: make them compact + tables[sig][this.indexedFunctions[ident]] = ident; } // Resolve multi-level aliases all the way down - for (var i = 0; i < vals.length; i++) { - while (1) { - var varData = Variables.globals[vals[i]]; - if (!(varData && varData.resolvedAlias)) break; - vals[i] = vals[+varData.resolvedAlias || eval(varData.resolvedAlias)]; // might need to eval to turn (6) into 6 + var generated = false; + for (var t in tables) { + generated = true; + var table = tables[t]; + for (var i = 0; i < table.length; i++) { + while (1) { + var varData = Variables.globals[table[i]]; + if (!(varData && varData.resolvedAlias)) break; + table[i] = table[+varData.resolvedAlias || eval(varData.resolvedAlias)]; // might need to eval to turn (6) into 6 + } + } + 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'; } } - var indices = vals.toString().replace('"', ''); - if (BUILD_AS_SHARED_LIB) { - // Shared libraries reuse the parent's function table. - return 'FUNCTION_TABLE.push.apply(FUNCTION_TABLE, [' + indices + ']);'; - } else { - return 'FUNCTION_TABLE = [' + indices + ']; Module["FUNCTION_TABLE"] = FUNCTION_TABLE;'; + if (!generated && !ASM_JS) { + tables['x'] = 'var FUNCTION_TABLE = [0, 0];\n'; // default empty table } + Functions.tables = tables; } }; @@ -311,16 +349,23 @@ var PassManager = { print('\n//FORWARDED_DATA:' + JSON.stringify({ Types: Types, Variables: Variables, - Functions: Functions + Functions: Functions, + EXPORTED_FUNCTIONS: EXPORTED_FUNCTIONS // needed for asm.js global constructors (ctors) })); } else if (phase == 'funcs') { print('\n//FORWARDED_DATA:' + JSON.stringify({ Types: { preciseI64MathUsed: Types.preciseI64MathUsed }, Functions: { blockAddresses: Functions.blockAddresses, - indexedFunctions: Functions.indexedFunctions + indexedFunctions: Functions.indexedFunctions, + implementedFunctions: ASM_JS ? Functions.implementedFunctions : [], + unimplementedFunctions: Functions.unimplementedFunctions, } })); + } else if (phase == 'post') { + print('\n//FORWARDED_DATA:' + JSON.stringify({ + Functions: { tables: Functions.tables } + })); } }, load: function(json) { diff --git a/src/parseTools.js b/src/parseTools.js index 4a76a9a2..36d62204 100644 --- a/src/parseTools.js +++ b/src/parseTools.js @@ -128,16 +128,48 @@ function isStructType(type) { return type[0] == '%'; } +function isStructuralType(type) { + return /^{ ?[^}]* ?}$/.test(type); // { i32, i8 } etc. - anonymous struct types +} + +function getStructuralTypeParts(type) { // split { i32, i8 } etc. into parts + return type.replace(/[ {}]/g, '').split(','); +} + +function getStructureTypeParts(type) { + if (isStructuralType(type)) { + return type.replace(/[ {}]/g, '').split(','); + } else { + var typeData = Types.types[type]; + assert(typeData, type); + return typeData.fields; + } +} + +function getStructuralTypePartBits(part) { + return Math.ceil((getBits(part) || 32)/32)*32; // simple 32-bit alignment. || 32 is for pointers +} + function isIntImplemented(type) { return type[0] == 'i' || isPointerType(type); } -// Note: works for iX types, not pointers (even though they are implemented as ints) +// Note: works for iX types and structure types, not pointers (even though they are implemented as ints) function getBits(type) { - if (!type || type[0] != 'i') return 0; - var left = type.substr(1); - if (!isNumber(left)) return 0; - return parseInt(left); + if (!type) return 0; + if (type[0] == 'i') { + var left = type.substr(1); + if (!isNumber(left)) return 0; + return parseInt(left); + } + if (isStructuralType(type)) { + return sum(getStructuralTypeParts(type).map(getStructuralTypePartBits)); + } + if (isStructType(type)) { + var typeData = Types.types[type]; + return typeData.flatSize*8; + } + return 0; } function isIllegalType(type) { @@ -163,11 +195,13 @@ function isFunctionDef(token, out) { var subtext = segment[0].text; fail = fail || segment.length > 1 || !(isType(subtext) || subtext == '...'); }); - if (out) out.numArgs = segments.length; + if (out) { + out.segments = segments; + out.numArgs = segments.length; + } return !fail; } - function isPossiblyFunctionType(type) { // A quick but unreliable way to see if something is a function type. Yes is just 'maybe', no is definite. var len = type.length; @@ -189,6 +223,7 @@ function isFunctionType(type, out) { if (pointingLevels(type) !== 1) return false; var text = removeAllPointing(parts.slice(1).join(' ')); if (!text) return false; + if (out) out.returnType = parts[0]; return isType(parts[0]) && isFunctionDef({ text: text, item: tokenize(text.substr(1, text.length-2), true) }, out); } @@ -310,7 +345,9 @@ function parseParamTokens(params) { if (segment.length == 1) { if (segment[0].text == '...') { ret.push({ - intertype: 'varargs' + intertype: 'varargs', + type: 'i8*', + ident: 'varrp' // the conventional name we have for this }); } else { // Clang sometimes has a parameter with just a type, @@ -373,12 +410,12 @@ function isIndexableGlobal(ident) { function makeGlobalDef(ident) { if (!NAMED_GLOBALS && isIndexableGlobal(ident)) return ''; - return 'var ' + ident + ';'; // TODO: add option for namespacing or offsetting to allow reducing the number of globals + return 'var ' + ident + ';'; } function makeGlobalUse(ident) { if (!NAMED_GLOBALS && isIndexableGlobal(ident)) return '(' + getFastValue('GLOBAL_BASE', '+', Variables.indexedGlobals[ident]) + ')'; - return ident; // TODO: add option for namespacing or offsetting to allow reducing the number of globals + return ident; } function sortGlobals(globals) { @@ -922,6 +959,12 @@ 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) { if (USE_TYPED_ARRAYS !== 2) { return offset; @@ -930,14 +973,42 @@ function getHeapOffset(offset, type) { 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') offset = '(' + offset + '&' + memoryMask + ')'; if (shifts != 0) { - return '((' + offset + ')>>' + (shifts) + ')'; + return '(' + offset + '>>' + shifts + ')'; } else { - return '(' + offset + ')'; + return offset; } } } +function makeVarDef(js) { + if (!ASM_JS) js = 'var ' + js; + return js; +} + +function asmInitializer(type, impl) { + if (isIntImplemented(type)) {// || (impl && impl == 'VAR_EMULATED')) { + return '0'; + } else { + return '+0'; + } +} + +function asmCoercion(value, type) { + if (!ASM_JS) return value; + if (isIntImplemented(type)) { + return '((' + value + ')|0)'; + } else { + return '(+(' + value + '))'; + } +} + +function makeGetTempDouble(i) { + return makeGetValue('tempDoublePtr', Runtime.getNativeTypeSize('i32')*i, 'i32'); +} + // See makeSetValue function makeGetValue(ptr, pos, type, noNeedFirst, unsigned, ignore, align, noSafe) { noticePtr(ptr); @@ -952,9 +1023,9 @@ function makeGetValue(ptr, pos, type, noNeedFirst, unsigned, ignore, align, noSa } if (DOUBLE_MODE == 1 && USE_TYPED_ARRAYS == 2 && type == 'double') { - return '(tempDoubleI32[0]=' + makeGetValue(ptr, pos, 'i32', noNeedFirst, unsigned, ignore, align) + ',' + - 'tempDoubleI32[1]=' + makeGetValue(ptr, getFastValue(pos, '+', Runtime.getNativeTypeSize('i32')), 'i32', noNeedFirst, unsigned, ignore, align) + ',' + - 'tempDoubleF64[0])'; + return '(HEAP32[tempDoublePtr>>2]=' + makeGetValue(ptr, pos, 'i32', noNeedFirst, unsigned, ignore, align) + ',' + + 'HEAP32[tempDoublePtr+4>>2]=' + makeGetValue(ptr, getFastValue(pos, '+', Runtime.getNativeTypeSize('i32')), 'i32', noNeedFirst, unsigned, ignore, align) + ',' + + 'HEAPF64[tempDoublePtr>>3])'; } if (USE_TYPED_ARRAYS == 2 && align) { @@ -977,9 +1048,9 @@ function makeGetValue(ptr, pos, type, noNeedFirst, unsigned, ignore, align, noSa } } else { if (type == 'float') { - ret += 'copyTempFloat(' + getFastValue(ptr, '+', pos) + '),tempDoubleF32[0]'; + ret += 'copyTempFloat(' + getFastValue(ptr, '+', pos) + '),HEAPF32[tempDoublePtr>>2]'; } else { - ret += 'copyTempDouble(' + getFastValue(ptr, '+', pos) + '),tempDoubleF64[0]'; + ret += 'copyTempDouble(' + getFastValue(ptr, '+', pos) + '),HEAP64[tempDoublePtr>>3]'; } } ret += ')'; @@ -993,14 +1064,24 @@ function makeGetValue(ptr, pos, type, noNeedFirst, unsigned, ignore, align, noSa if (type[0] === '#') type = type.substr(1); return 'SAFE_HEAP_LOAD(' + offset + ', ' + type + ', ' + (!!unsigned+0) + ', ' + ((!checkSafeHeap() || ignore)|0) + ')'; } else { - return makeGetSlabs(ptr, type, false, unsigned)[0] + '[' + getHeapOffset(offset, type) + ']'; + var ret = makeGetSlabs(ptr, type, false, unsigned)[0] + '[' + getHeapOffset(offset, type) + ']'; + if (ASM_JS && phase == 'funcs') { + ret = asmCoercion(ret, type); + } + return ret; } } function indexizeFunctions(value, type) { assert((type && type !== '?') || (typeof value === 'string' && value.substr(0, 6) === 'CHECK_'), 'No type given for function indexizing'); assert(value !== type, 'Type set to value'); - if (type && isFunctionType(type) && value[0] === '_') { // checking for _ differentiates from $ (local vars) + var out = {}; + if (type && isFunctionType(type, out) && value[0] === '_') { // checking for _ differentiates from $ (local vars) + // add signature to library functions that we now know need indexing + if (!(value in Functions.implementedFunctions) && !(value in Functions.unimplementedFunctions)) { + Functions.unimplementedFunctions[value] = Functions.getSignature(out.returnType, out.segments ? out.segments.map(function(segment) { return segment[0].text }) : []); + } + if (BUILD_AS_SHARED_LIB) { return '(FUNCTION_TABLE_OFFSET + ' + Functions.getIndex(value) + ')'; } else { @@ -1039,9 +1120,9 @@ function makeSetValue(ptr, pos, value, type, noNeedFirst, ignore, align, noSafe, } if (DOUBLE_MODE == 1 && USE_TYPED_ARRAYS == 2 && type == 'double') { - return '(tempDoubleF64[0]=' + value + ',' + - makeSetValue(ptr, pos, 'tempDoubleI32[0]', 'i32', noNeedFirst, ignore, align, noSafe, ',') + ',' + - makeSetValue(ptr, getFastValue(pos, '+', Runtime.getNativeTypeSize('i32')), 'tempDoubleI32[1]', 'i32', noNeedFirst, ignore, align, noSafe, ',') + ')'; + return '(HEAPF64[tempDoublePtr>>3]=' + value + ',' + + makeSetValue(ptr, pos, 'HEAP32[tempDoublePtr>>2]', 'i32', noNeedFirst, ignore, align, noSafe, ',') + ',' + + makeSetValue(ptr, getFastValue(pos, '+', Runtime.getNativeTypeSize('i32')), 'HEAP32[tempDoublePtr+4>>2]', 'i32', noNeedFirst, ignore, align, noSafe, ',') + ')'; } else if (USE_TYPED_ARRAYS == 2 && type == 'i64') { return '(tempI64 = [' + splitI64(value) + '],' + makeSetValue(ptr, pos, 'tempI64[0]', 'i32', noNeedFirst, ignore, align, noSafe, ',') + ',' + @@ -1125,7 +1206,7 @@ function makeSetValues(ptr, pos, value, type, num, align) { [4, 2, 1].forEach(function(possibleAlign) { if (num == 0) return; if (align >= possibleAlign) { - if (num <= UNROLL_LOOP_MAX*possibleAlign) { + if (num <= UNROLL_LOOP_MAX*possibleAlign || ASM_JS) { // XXX test asm performance ret.push(unroll('i' + (possibleAlign*8), Math.floor(num/possibleAlign), possibleAlign, values[possibleAlign])); } else { ret.push('for (var $$dest = ' + getFastValue(ptr, '+', pos) + (possibleAlign > 1 ? '>>' + log2(possibleAlign) : '') + ', ' + @@ -1179,7 +1260,7 @@ function makeCopyValues(dest, src, num, type, modifier, align, sep) { if (num == 0) return; if (align >= possibleAlign) { // If we can unroll the loop, do so. Also do so if we must unroll it (we do not create real loops when inlined) - if (num <= UNROLL_LOOP_MAX*possibleAlign || sep == ',') { + if (num <= UNROLL_LOOP_MAX*possibleAlign || sep == ',' || ASM_JS) { // XXX test asm performance ret.push(unroll('i' + (possibleAlign*8), Math.floor(num/possibleAlign), possibleAlign)); } else { assert(sep == ';'); @@ -1489,8 +1570,35 @@ function handleOverflow(text, bits) { } } -function makeLLVMStruct(values) { // TODO: Use this everywhere - return '{ ' + values.map(function(value, i) { return 'f' + i + ': ' + value }).join(', ') + ' }' +function makeLLVMStruct(values) { + if (USE_TYPED_ARRAYS == 2) { + return 'DEPRECATED' + (new Error().stack) + 'XXX'; + } else { + return '{ ' + values.map(function(value, i) { return 'f' + i + ': ' + value }).join(', ') + ' }' + } +} + +function makeStructuralReturn(values) { + if (USE_TYPED_ARRAYS == 2) { + var i = 0; + return 'return (' + values.slice(1).map(function(value) { + return ASM_JS ? 'asm.setTempRet' + (i++) + '(' + value + ')' + : 'tempRet' + (i++) + ' = ' + value; + }).concat([values[0]]).join(',') + ')'; + } else { + var i = 0; + return 'return { ' + values.map(function(value) { + return 'f' + (i++) + ': ' + value; + }).join(', ') + ' }'; + } +} + +function makeStructuralAccess(ident, i) { + if (USE_TYPED_ARRAYS == 2) { + return ident + '$' + i; + } else { + return ident + '.f' + i; + } } // From parseLLVMSegment @@ -1599,6 +1707,10 @@ function makeSignOp(value, type, op, force, ignore) { function makeRounding(value, bits, signed, floatConversion) { // TODO: handle roundings of i64s assert(bits); + if (ASM_JS && floatConversion && bits <= 32) { + return '(~~(' + value + '))'; // explicit float-to-int conversion + } + // C rounds to 0 (-5.5 to -5, +5.5 to 5), while JS has no direct way to do that. if (bits <= 32 && signed) return '((' + value + ')&-1)'; // This is fast and even correct, for all cases. Note that it is the same // as |0, but &-1 hints to the js optimizer that this is a rounding correction @@ -1696,8 +1808,8 @@ function processMathop(item) { } function i64PreciseOp(type, lastArg) { Types.preciseI64MathUsed = true; - return finish(['(i64Math.' + type + '(' + low1 + ',' + high1 + ',' + low2 + ',' + high2 + - (lastArg ? ',' + lastArg : '') + '),i64Math.result[0])', 'i64Math.result[1]']); + return finish(['(i64Math' + (ASM_JS ? '_' : '.') + type + '(' + low1 + ',' + high1 + ',' + low2 + ',' + high2 + + (lastArg ? ',' + lastArg : '') + '),' + makeGetValue('tempDoublePtr', 0, 'i32') + ')', makeGetValue('tempDoublePtr', Runtime.getNativeTypeSize('i32'), 'i32')]); } switch (op) { // basic integer ops @@ -1714,7 +1826,8 @@ function processMathop(item) { case 'ashr': case 'lshr': { if (!isNumber(idents[1])) { - return 'Runtime.bitshift64(' + idents[0] + '[0], ' + idents[0] + '[1],"' + op + '",' + stripCorrections(idents[1]) + '[0]|0)'; + return '(Runtime' + (ASM_JS ? '_' : '.') + 'bitshift64(' + idents[0] + '[0], ' + idents[0] + '[1],"' + op + '",' + stripCorrections(idents[1]) + '[0]|0),' + + '[' + makeGetTempDouble(0) + ',' + makeGetTempDouble(1) + '])'; } bits = parseInt(idents[1]); var ander = Math.pow(2, bits)-1; @@ -1831,15 +1944,15 @@ function processMathop(item) { var outType = item.type; if (inType in Runtime.INT_TYPES && outType in Runtime.FLOAT_TYPES) { if (legalizedI64s) { - return '(tempDoubleI32[0]=' + idents[0] + '$0, tempDoubleI32[1]=' + idents[0] + '$1, tempDoubleF64[0])'; + return '(HEAP32[tempDoublePtr>>2]=' + idents[0] + '$0, HEAP32[tempDoublePtr+4>>2]=' + idents[0] + '$1, HEAPF64[tempDoublePtr>>3])'; } else { - return makeInlineCalculation('tempDoubleI32[0]=VALUE[0],tempDoubleI32[1]=VALUE[1],tempDoubleF64[0]', idents[0], 'tempI64'); + return makeInlineCalculation('HEAP32[tempDoublePtr>>2]=VALUE[0],HEAP32[tempDoublePtr+4>>2]=VALUE[1],HEAPF64[tempDoublePtr>>>3]', idents[0], 'tempI64'); } } else if (inType in Runtime.FLOAT_TYPES && outType in Runtime.INT_TYPES) { if (legalizedI64s) { - return 'tempDoubleF64[0]=' + idents[0] + '; ' + finish(['tempDoubleI32[0]','tempDoubleI32[1]']); + return 'HEAPF64[tempDoublePtr>>3]=' + idents[0] + '; ' + finish(['HEAP32[tempDoublePtr>>2]','HEAP32[tempDoublePtr+4>>2]']); } else { - return '(tempDoubleF64[0]=' + idents[0] + ',[tempDoubleI32[0],tempDoubleI32[1]])'; + return '(HEAPF64[tempDoublePtr>>3]=' + idents[0] + ',[HEAP32[tempDoublePtr>>2],HEAP32[tempDoublePtr+4>>2]])'; } } else { throw 'Invalid USE_TYPED_ARRAYS == 2 bitcast: ' + dump(item) + ' : ' + item.params[0].type; @@ -1857,7 +1970,7 @@ function processMathop(item) { case 'mul': { if (bits == 32 && PRECISE_I32_MUL) { Types.preciseI64MathUsed = true; - return '(i64Math.multiply(' + idents[0] + ',0,' + idents[1] + ',0),i64Math.result[0])'; + return '(i64Math' + (ASM_JS ? '_' : '.') + 'multiply(' + idents[0] + ',0,' + idents[1] + ',0),' + makeGetValue('tempDoublePtr', 0, 'i32') + ')'; } else { return handleOverflow(getFastValue(idents[0], '*', idents[1], item.type), bits); } @@ -1978,9 +2091,9 @@ function processMathop(item) { (inType in Runtime.FLOAT_TYPES && outType in Runtime.INT_TYPES)) { assert(USE_TYPED_ARRAYS == 2, 'Can only bitcast ints <-> floats with typed arrays mode 2'); if (inType in Runtime.INT_TYPES) { - return '(tempDoubleI32[0] = ' + idents[0] + ',tempDoubleF32[0])'; + return '(HEAP32[tempDoublePtr>>2] = ' + idents[0] + ',HEAPF32[tempDoublePtr>>2])'; } else { - return '(tempDoubleF32[0] = ' + idents[0] + ',tempDoubleI32[0])'; + return '(HEAPF32[tempDoublePtr>>2] = ' + idents[0] + ',HEAP32[tempDoublePtr>>2])'; } } return idents[0]; diff --git a/src/postamble.js b/src/postamble.js index 144b5af9..83a4daa6 100644 --- a/src/postamble.js +++ b/src/postamble.js @@ -19,11 +19,11 @@ Module.callMain = function callMain(args) { #if CATCH_EXIT_CODE try { - return _main(argc, argv, 0); + return Module['_main'](argc, argv, 0); } catch(e) { if (e.name == "ExitStatus") return e.status; throw e; } #else - return _main(argc, argv, 0); + return Module['_main'](argc, argv, 0); #endif } diff --git a/src/preamble.js b/src/preamble.js index 0917f977..b28dfc0d 100644 --- a/src/preamble.js +++ b/src/preamble.js @@ -275,7 +275,7 @@ Module['printProfiling'] = printProfiling; // Runtime essentials //======================================== -var __THREW__ = false; // Used in checking for thrown exceptions. +var __THREW__ = 0; // Used in checking for thrown exceptions. var setjmpId = 1; // Used in setjmp/longjmp var setjmpLabels = {}; @@ -287,6 +287,7 @@ var undef = 0; var tempValue, tempInt, tempBigInt, tempInt2, tempBigInt2, tempPair, tempBigIntI, tempBigIntR, tempBigIntS, tempBigIntP, tempBigIntD; #if USE_TYPED_ARRAYS == 2 var tempI64, tempI64b; +var tempRet0, tempRet1, tempRet2, tempRet3, tempRet4, tempRet5, tempRet6, tempRet7, tempRet8, tempRet9; #endif function abort(text) { @@ -577,9 +578,6 @@ Module['Array_stringify'] = Array_stringify; // Memory management -var FUNCTION_TABLE; // XXX: In theory the indexes here can be equal to pointers to stacked or malloced memory. Such comparisons should - // be false, but can turn out true. We should probably set the top bit to prevent such issues. - var PAGE_SIZE = 4096; function alignMemoryPage(x) { return ((x+4095)>>12)<<12; @@ -703,25 +701,21 @@ STACK_MAX = STACK_ROOT + TOTAL_STACK; #if USE_TYPED_ARRAYS == 2 var tempDoublePtr = Runtime.alignMemory(STACK_MAX, 8); -var tempDoubleI8 = HEAP8.subarray(tempDoublePtr); -var tempDoubleI32 = HEAP32.subarray(tempDoublePtr >> 2); -var tempDoubleF32 = HEAPF32.subarray(tempDoublePtr >> 2); -var tempDoubleF64 = HEAPF64.subarray(tempDoublePtr >> 3); function copyTempFloat(ptr) { // functions, because inlining this code is increases code size too much - tempDoubleI8[0] = HEAP8[ptr]; - tempDoubleI8[1] = HEAP8[ptr+1]; - tempDoubleI8[2] = HEAP8[ptr+2]; - tempDoubleI8[3] = HEAP8[ptr+3]; + HEAP8[tempDoublePtr] = HEAP8[ptr]; + HEAP8[tempDoublePtr+1] = HEAP8[ptr+1]; + HEAP8[tempDoublePtr+2] = HEAP8[ptr+2]; + HEAP8[tempDoublePtr+3] = HEAP8[ptr+3]; } function copyTempDouble(ptr) { - tempDoubleI8[0] = HEAP8[ptr]; - tempDoubleI8[1] = HEAP8[ptr+1]; - tempDoubleI8[2] = HEAP8[ptr+2]; - tempDoubleI8[3] = HEAP8[ptr+3]; - tempDoubleI8[4] = HEAP8[ptr+4]; - tempDoubleI8[5] = HEAP8[ptr+5]; - tempDoubleI8[6] = HEAP8[ptr+6]; - tempDoubleI8[7] = HEAP8[ptr+7]; + HEAP8[tempDoublePtr] = HEAP8[ptr]; + HEAP8[tempDoublePtr+1] = HEAP8[ptr+1]; + HEAP8[tempDoublePtr+2] = HEAP8[ptr+2]; + HEAP8[tempDoublePtr+3] = HEAP8[ptr+3]; + HEAP8[tempDoublePtr+4] = HEAP8[ptr+4]; + HEAP8[tempDoublePtr+5] = HEAP8[ptr+5]; + HEAP8[tempDoublePtr+6] = HEAP8[ptr+6]; + HEAP8[tempDoublePtr+7] = HEAP8[ptr+7]; } STACK_MAX = tempDoublePtr + 8; #endif @@ -737,9 +731,14 @@ function callRuntimeCallbacks(callbacks) { var callback = callbacks.shift(); var func = callback.func; if (typeof func === 'number') { - func = FUNCTION_TABLE[func]; + if (callback.arg === undefined) { + Runtime.dynCall('v', func); + } else { + Runtime.dynCall('vi', func, [callback.arg]); + } + } else { + func(callback.arg === undefined ? null : callback.arg); } - func(callback.arg === undefined ? null : callback.arg); } } diff --git a/src/runtime.js b/src/runtime.js index dd14e779..9d5e5e1f 100644 --- a/src/runtime.js +++ b/src/runtime.js @@ -13,7 +13,7 @@ var RuntimeGenerator = { if (init) { ret += sep + '_memset(' + type + 'TOP, 0, ' + size + ')'; } - ret += sep + type + 'TOP += ' + size; + ret += sep + type + 'TOP = (' + type + 'TOP + ' + size + ')|0'; if ({{{ QUANTUM_SIZE }}} > 1 && !ignoreAlign) { ret += sep + RuntimeGenerator.alignMemory(type + 'TOP', {{{ QUANTUM_SIZE }}}); } @@ -23,27 +23,27 @@ var RuntimeGenerator = { // An allocation that lives as long as the current function call stackAlloc: function(size, sep) { sep = sep || ';'; - if (USE_TYPED_ARRAYS === 2) 'STACKTOP += STACKTOP % ' + ({{{ QUANTUM_SIZE }}} - (isNumber(size) ? Math.min(size, {{{ QUANTUM_SIZE }}}) : {{{ QUANTUM_SIZE }}})) + sep; + if (USE_TYPED_ARRAYS === 2) 'STACKTOP = (STACKTOP + STACKTOP|0 % ' + ({{{ QUANTUM_SIZE }}} - (isNumber(size) ? Math.min(size, {{{ QUANTUM_SIZE }}}) : {{{ QUANTUM_SIZE }}})) + ')' + sep; // The stack is always QUANTUM SIZE aligned, so we may not need to force alignment here var ret = RuntimeGenerator.alloc(size, 'STACK', INIT_STACK, sep, USE_TYPED_ARRAYS != 2 || (isNumber(size) && parseInt(size) % {{{ QUANTUM_SIZE }}} == 0)); if (ASSERTIONS) { - ret += sep + 'assert(STACKTOP < STACK_ROOT + STACK_MAX, "Ran out of stack")'; + ret += sep + 'assert(STACKTOP|0 < STACK_MAX|0)'; } return ret; }, stackEnter: function(initial, force) { if (initial === 0 && SKIP_STACK_IN_SMALL && !force) return ''; - var ret = 'var __stackBase__ = STACKTOP'; - if (initial > 0) ret += '; STACKTOP += ' + initial; + var ret = 'var __stackBase__ = ' + (ASM_JS ? '0; __stackBase__ = ' : '') + 'STACKTOP'; + if (initial > 0) ret += '; STACKTOP = (STACKTOP + ' + initial + ')|0'; if (USE_TYPED_ARRAYS == 2) { assert(initial % QUANTUM_SIZE == 0); if (ASSERTIONS) { - ret += '; assert(STACKTOP % {{{ QUANTUM_SIZE }}} == 0, "Stack is unaligned")'; + ret += '; assert(STACKTOP|0 % {{{ QUANTUM_SIZE }}} == 0)'; } } if (ASSERTIONS) { - ret += '; assert(STACKTOP < STACK_MAX, "Ran out of stack")'; + ret += '; assert(STACKTOP < STACK_MAX)'; } if (INIT_STACK) { ret += '; _memset(__stackBase__, 0, ' + initial + ')'; @@ -124,36 +124,50 @@ var Runtime = { // Mirrors processMathop's treatment of constants (which we optimize directly) bitshift64: function(low, high, op, bits) { + var ret; var ander = Math.pow(2, bits)-1; if (bits < 32) { switch (op) { case 'shl': - return [low << bits, (high << bits) | ((low&(ander << (32 - bits))) >>> (32 - bits))]; + ret = [low << bits, (high << bits) | ((low&(ander << (32 - bits))) >>> (32 - bits))]; + break; case 'ashr': - return [(((low >>> bits ) | ((high&ander) << (32 - bits))) >> 0) >>> 0, (high >> bits) >>> 0]; + ret = [(((low >>> bits ) | ((high&ander) << (32 - bits))) >> 0) >>> 0, (high >> bits) >>> 0]; + break; case 'lshr': - return [((low >>> bits) | ((high&ander) << (32 - bits))) >>> 0, high >>> bits]; + ret = [((low >>> bits) | ((high&ander) << (32 - bits))) >>> 0, high >>> bits]; + break; } } else if (bits == 32) { switch (op) { case 'shl': - return [0, low]; + ret = [0, low]; + break; case 'ashr': - return [high, (high|0) < 0 ? ander : 0]; + ret = [high, (high|0) < 0 ? ander : 0]; + break; case 'lshr': - return [high, 0]; + ret = [high, 0]; + break; } } else { // bits > 32 switch (op) { case 'shl': - return [0, low << (bits - 32)]; + ret = [0, low << (bits - 32)]; + break; case 'ashr': - return [(high >> (bits - 32)) >>> 0, (high|0) < 0 ? ander : 0]; + ret = [(high >> (bits - 32)) >>> 0, (high|0) < 0 ? ander : 0]; + break; case 'lshr': - return [high >>> (bits - 32) , 0]; + ret = [high >>> (bits - 32) , 0]; + break; } } - abort('unknown bitshift64 op: ' + [value, op, bits]); +#if ASSERTIONS + assert(ret); +#endif + HEAP32[tempDoublePtr>>2] = ret[0]; // cannot use utility functions since we are in runtime itself + HEAP32[tempDoublePtr+4>>2] = ret[1]; }, // Imprecise bitops utilities @@ -311,10 +325,35 @@ var Runtime = { return ret; }, - addFunction: function(func) { - var ret = FUNCTION_TABLE.length; - FUNCTION_TABLE.push(func); - FUNCTION_TABLE.push(0); + dynCall: function(sig, ptr, args) { + if (args && args.length) { +#if ASSERTIONS + assert(args.length == sig.length-1); +#endif +#if ASM_JS + args.splice(0, 0, ptr); + return Module['dynCall_' + sig].apply(null, args); +#else + return FUNCTION_TABLE[ptr].apply(null, args); +#endif + } else { +#if ASSERTIONS + assert(sig.length == 1); +#endif +#if ASM_JS + return Module['dynCall_' + sig].call(null, ptr); +#else + return FUNCTION_TABLE[ptr](); +#endif + } + }, + + addFunction: function(func, sig) { + assert(sig); + var table = FUNCTION_TABLE; // TODO: support asm + var ret = table.length; + table.push(func); + table.push(0); return ret; }, @@ -328,10 +367,11 @@ var Runtime = { funcWrappers: {}, - getFuncWrapper: function(func) { + getFuncWrapper: function(func, sig) { + assert(sig); if (!Runtime.funcWrappers[func]) { Runtime.funcWrappers[func] = function() { - FUNCTION_TABLE[func].apply(null, arguments); + Runtime.dynCall(sig, func, arguments); }; } return Runtime.funcWrappers[func]; diff --git a/src/settings.js b/src/settings.js index 1d8805a8..b9dfa9e9 100644 --- a/src/settings.js +++ b/src/settings.js @@ -43,7 +43,7 @@ var TOTAL_STACK = 5*1024*1024; // The total stack size. There is no way to enlar // value must be large enough for the program's requirements. If // assertions are on, we will assert on not exceeding this, otherwise, // it will fail silently. -var TOTAL_MEMORY = 10*1024*1024; // The total amount of memory to use. Using more memory than this will +var TOTAL_MEMORY = 16777216; // The total amount of memory to use. Using more memory than this will // cause us to expand the heap, which can be costly with typed arrays: // we need to copy the old heap into a new one in that case. var FAST_MEMORY = 2*1024*1024; // The amount of memory to initialize to 0. This ensures it will be @@ -294,6 +294,8 @@ var HEADLESS = 0; // If 1, will include shim code that tries to 'fake' a browser // very partial - it is hard to fake a whole browser! - so // keep your expectations low for this to work. +var ASM_JS = 0; // If 1, generate code in asm.js format + var NECESSARY_BLOCKADDRS = []; // List of (function, block) for all block addresses that are taken. // Compiler debugging options diff --git a/src/utility.js b/src/utility.js index 84b50ce9..63582ae8 100644 --- a/src/utility.js +++ b/src/utility.js @@ -321,6 +321,12 @@ function isPowerOfTwo(x) { return x > 0 && ((x & (x-1)) == 0); } +function ceilPowerOfTwo(x) { + var ret = 1; + while (ret < x) ret <<= 1; + return ret; +} + function Benchmarker() { var starts = {}, times = {}, counts = {}; this.start = function(id) { diff --git a/tests/cases/aliasbitcast2.ll b/tests/cases/aliasbitcast2_noasm.ll index 8537e272..8537e272 100644 --- a/tests/cases/aliasbitcast2.ll +++ b/tests/cases/aliasbitcast2_noasm.ll diff --git a/tests/cases/aliasbitcast3.ll b/tests/cases/aliasbitcast3_noasm.ll index 4ff969e3..4ff969e3 100644 --- a/tests/cases/aliasbitcast3.ll +++ b/tests/cases/aliasbitcast3_noasm.ll diff --git a/tests/cases/aliasbitcastdollar.ll b/tests/cases/aliasbitcastdollar_noasm.ll index 1ecf6047..1ecf6047 100644 --- a/tests/cases/aliasbitcastdollar.ll +++ b/tests/cases/aliasbitcastdollar_noasm.ll diff --git a/tests/cases/longjmp_tiny.ll b/tests/cases/longjmp_tiny_noasm.ll index 0045847c..0045847c 100644 --- a/tests/cases/longjmp_tiny.ll +++ b/tests/cases/longjmp_tiny_noasm.ll diff --git a/tests/cases/longjmp_tiny.txt b/tests/cases/longjmp_tiny_noasm.txt index 8a0aa386..8a0aa386 100644 --- a/tests/cases/longjmp_tiny.txt +++ b/tests/cases/longjmp_tiny_noasm.txt diff --git a/tests/cases/selectstruct.ll b/tests/cases/selectstruct.ll index 90c15ac7..5c9fecf7 100644 --- a/tests/cases/selectstruct.ll +++ b/tests/cases/selectstruct.ll @@ -10,7 +10,8 @@ entry: %retval = alloca i32, align 4 ; [#uses=1 type=i32*] %. = select i1 %retval, { i32, i32 } { i32 55, i32 99 }, { i32, i32 } { i32 2, i32 6 } ; [#uses=1 type={ i32, i32 }] store i32 0, i32* %retval - %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([15 x i8]* @.str, i32 0, i32 0), i32 %.) ; [#uses=0 type=i32] + %.1 = extractvalue { i32, i32 } %., 0 + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([15 x i8]* @.str, i32 0, i32 0), i32 %.1) ; [#uses=0 type=i32] ret i32 1 } diff --git a/tests/cases/structparam.ll b/tests/cases/structparam.ll new file mode 100644 index 00000000..c59ad600 --- /dev/null +++ b/tests/cases/structparam.ll @@ -0,0 +1,36 @@ +; ModuleID = '/dev/shm/tmp/src.cpp.o' +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" +target triple = "i386-pc-linux-gnu" + +@.str = private unnamed_addr constant [15 x i8] c"hello, %d %d!\0A\00", align 1 ; [#uses=1 type=[15 x i8]*] +@_dispatchTable = internal global i64 0 + +define i32 @doit(i32 %x, { i32, i32 } %y) { + %y0 = extractvalue { i32, i32 } %y, 0 + %y1 = extractvalue { i32, i32 } %y, 1 + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([15 x i8]* @.str, i32 0, i32 0), i32 %y0, i32 %y1) ; [#uses=0 type=i32] [debug line = 5:13] + ret i32 0 +} + +define i32 @main() { +entry: + %retval = alloca i32, align 4 ; [#uses=1 type=i32*] + %myi64 = alloca i64, align 4 + %comp = alloca { i32, i32 }, align 4 ; [#uses=1] + store i32 0, i32* %retval + br label %cond.end + +cond.null: + br label %cond.end + +cond.end: ; preds = %cond.false, %cond.true + %cond = phi { i32, i32 } [ { i32 5, i32 6 }, %entry ], [ zeroinitializer, %cond.null ] ; [#uses=1] + store { i32, i32 } %cond, { i32, i32 }* %comp + %call = call i32 (i32, { i32, i32 })* @doit(i32 1, { i32, i32 } %cond) ; + store { i32, i32 } { i32 ptrtoint (i64* @_dispatchTable to i32), i32 0 }, { i32, i32 }* getelementptr inbounds ([1 x i64]* @_dispatchTable, i32 0, i32 0, i32 1), align 4 + ret i32 0 ; [debug line = 6:13] +} + +; [#uses=1] +declare i32 @printf(i8*, ...) + diff --git a/tests/cases/structparam.txt b/tests/cases/structparam.txt new file mode 100644 index 00000000..b2a63262 --- /dev/null +++ b/tests/cases/structparam.txt @@ -0,0 +1 @@ +hello, 5 6! diff --git a/tests/cases/uadd_overflow.ll b/tests/cases/uadd_overflow.ll deleted file mode 100644 index a808b9de..00000000 --- a/tests/cases/uadd_overflow.ll +++ /dev/null @@ -1,25 +0,0 @@ -; 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" - -@.str2 = private constant [9 x i8] c"*%d,%d*\0A\00", align 1 ; [#uses=1] - -; [#uses=0] -define i32 @main() { -entry: - %retval = alloca i32, align 4 ; [#uses=1 type=i32*] - %mul7 = bitcast i32 -259741926 to i32 - %shl10 = shl i32 4014, 16 - %uadd1 = tail call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %mul7, i32 %shl10) - %a0 = extractvalue { i32, i1 } %uadd1, 0 - %a1 = extractvalue { i32, i1 } %uadd1, 1 - %a2 = zext i1 %a1 to i32 - call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([9 x i8]* @.str2, i32 0, i32 0), i32 %a0, i32 %a2) ; [#uses=0] - ret i32 1 -} - -; [#uses=1] -declare i32 @printf(i8*, ...) - -declare { i32, i1 } @llvm.uadd.with.overflow.i32(i32, i32) nounwind readnone - diff --git a/tests/cases/uadd_overflow.txt b/tests/cases/uadd_overflow.txt deleted file mode 100644 index dcda9240..00000000 --- a/tests/cases/uadd_overflow.txt +++ /dev/null @@ -1 +0,0 @@ -*3319578,1* diff --git a/tests/cases/uadd_overflow_ta2.ll b/tests/cases/uadd_overflow_ta2.ll new file mode 100644 index 00000000..81a76bcd --- /dev/null +++ b/tests/cases/uadd_overflow_ta2.ll @@ -0,0 +1,44 @@ +; 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" + +@.str2 = private constant [9 x i8] c"*%d,%d*\0A\00", align 1 ; [#uses=1] + +; [#uses=0] +define i32 @main() { +entry: + %retval = alloca i32, align 4 ; [#uses=1 type=i32*] + %mul7 = bitcast i32 -259741926 to i32 + %shl10 = shl i32 4014, 16 + %uadd1 = tail call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %mul7, i32 %shl10) + %a0 = extractvalue { i32, i1 } %uadd1, 0 + %a1 = extractvalue { i32, i1 } %uadd1, 1 + %a2 = zext i1 %a1 to i32 + call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([9 x i8]* @.str2, i32 0, i32 0), i32 %a0, i32 %a2) ; [#uses=0] + + %buadd1prepre = tail call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %mul7, i32 %shl10) + %buadd1pre = insertvalue { i32, i1 } %buadd1prepre, i1 0, 1 + %buadd1 = insertvalue { i32, i1 } %buadd1pre, i32 5177, 0 + %ba0 = extractvalue { i32, i1 } %buadd1, 0 + %ba1 = extractvalue { i32, i1 } %buadd1, 1 + %ba2 = zext i1 %ba1 to i32 + call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([9 x i8]* @.str2, i32 0, i32 0), i32 %ba0, i32 %ba2) ; [#uses=0] + + %64buadd1pre = tail call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 5000, i64 3000) + %64buadd1 = insertvalue { i64, i1 } %64buadd1pre, i64 9875, 0 + %64buadd2 = insertvalue { i64, i1 } %64buadd1, i1 1, 1 + %64ba0pre = extractvalue { i64, i1 } %64buadd2, 0 + %64ba0 = trunc i64 %64ba0pre to i32 + %64ba1 = extractvalue { i64, i1 } %64buadd2, 1 + %64ba2 = zext i1 %64ba1 to i32 + call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([9 x i8]* @.str2, i32 0, i32 0), i32 %64ba0, i32 %64ba2) ; [#uses=0] + + ret i32 1 +} + +; [#uses=1] +declare i32 @printf(i8*, ...) + +declare { i32, i1 } @llvm.uadd.with.overflow.i32(i32, i32) nounwind readnone +declare { i64, i1 } @llvm.uadd.with.overflow.i64(i64, i32) nounwind readnone + diff --git a/tests/cases/uadd_overflow_ta2.txt b/tests/cases/uadd_overflow_ta2.txt new file mode 100644 index 00000000..bcd04599 --- /dev/null +++ b/tests/cases/uadd_overflow_ta2.txt @@ -0,0 +1,3 @@ +*3319578,1* +*5177,0* +*9875,1* diff --git a/tests/runner.py b/tests/runner.py index 775225c6..f6383edd 100755 --- a/tests/runner.py +++ b/tests/runner.py @@ -428,7 +428,7 @@ if 'benchmark' not in str(sys.argv) and 'sanity' not in str(sys.argv) and 'brows if len(sys.argv) == 2 and 'ALL.' in sys.argv[1]: ignore, test = sys.argv[1].split('.') print 'Running all test modes on test "%s"' % test - sys.argv = [sys.argv[0], 'default.'+test, 'o1.'+test, 'o2.'+test, 's_0_0.'+test, 's_0_1.'+test, 's_0_1_q1.'+test, 's_1_0.'+test, 's_1_1.'+test, 's_1_1_q1.'+test] + sys.argv = [sys.argv[0], 'default.'+test, 'o1.'+test, 'o2.'+test, 'asm.'+test, 'asm2.'+test, 's_0_0.'+test, 's_0_1.'+test, 's_0_1_q1.'+test, 's_1_0.'+test, 's_1_1.'+test, 's_1_1_q1.'+test] 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. @@ -836,6 +836,7 @@ if 'benchmark' not in str(sys.argv) and 'sanity' not in str(sys.argv) and 'brows def test_i64_cmp2(self): if Settings.USE_TYPED_ARRAYS != 2: return self.skip('full i64 stuff only in ta2') + src = r''' #include <inttypes.h> #include <stdio.h> @@ -881,6 +882,8 @@ m_divisor is 1091269979 def test_i64_double(self): if Settings.USE_TYPED_ARRAYS != 2: return self.skip('full i64 stuff only in ta2') + + src = r''' #include <stdio.h> @@ -923,6 +926,7 @@ m_divisor is 1091269979 def test_i64_umul(self): if Settings.USE_TYPED_ARRAYS != 2: return self.skip('full i64 stuff only in ta2') + src = r''' #include <inttypes.h> #include <stdio.h> @@ -1193,6 +1197,7 @@ c5,de,15,8a self.do_run(open(path_from_root('tests', 'cube2md5.cpp')).read(), open(path_from_root('tests', 'cube2md5.ok')).read()) def test_cube2hash(self): + try: old_chunk_size = os.environ.get('EMSCRIPT_MAX_CHUNK_SIZE') or '' os.environ['EMSCRIPT_MAX_CHUNK_SIZE'] = '1' # test splitting out each function to a chunk in emscripten.py (21 functions here) @@ -1322,7 +1327,7 @@ c5,de,15,8a # corrections otherwise if Settings.USE_TYPED_ARRAYS == 2: Settings.CORRECT_SIGNS = 0 - Settings.CHECK_SIGNS = 1 + Settings.CHECK_SIGNS = 1 if not Settings.ASM_JS else 0 else: Settings.CORRECT_SIGNS = 1 Settings.CHECK_SIGNS = 0 @@ -1998,6 +2003,8 @@ c5,de,15,8a self.do_run(src, 'Assertion failed: 1 == false') def test_longjmp(self): + if Settings.ASM_JS: return self.skip('asm does not support longjmp') + src = r''' #include <stdio.h> #include <setjmp.h> @@ -2033,6 +2040,8 @@ c5,de,15,8a self.do_run(src, 'second\nmain: 0\n') def test_longjmp2(self): + if Settings.ASM_JS: return self.skip('asm does not support longjmp') + src = r''' #include <setjmp.h> #include <stdio.h> @@ -2079,6 +2088,8 @@ Exiting stack_manipulate_func, level: 0 ''') def test_longjmp3(self): + if Settings.ASM_JS: return self.skip('asm does not support longjmp') + src = r''' #include <setjmp.h> #include <stdio.h> @@ -2131,6 +2142,8 @@ Exiting setjmp function, level: 0 ''') def test_longjmp4(self): + if Settings.ASM_JS: return self.skip('asm does not support longjmp') + src = r''' #include <setjmp.h> #include <stdio.h> @@ -2491,6 +2504,7 @@ Exiting setjmp function, level: 0, prev_jmp: -1 def test_segfault(self): if self.emcc_args is None: return self.skip('SAFE_HEAP without ta2 means we check types too, which hide segfaults') + if Settings.ASM_JS: return self.skip('asm does not support safe heap') Settings.SAFE_HEAP = 1 @@ -3035,7 +3049,7 @@ Exiting setjmp function, level: 0, prev_jmp: -1 emscripten_run_script("Module.print('hello world' + '!')"); printf("*%d*\n", emscripten_run_script_int("5*20")); printf("*%s*\n", emscripten_run_script_string("'five'+'six'")); - emscripten_run_script("_save_me_aimee()"); + emscripten_run_script("Module['_save_me_aimee']()"); return 0; } ''' @@ -3045,7 +3059,7 @@ def process(filename): src = open(filename, 'r').read() # TODO: restore this (see comment in emscripten.h) assert '// hello from the source' in src ''' - + Settings.EXPORTED_FUNCTIONS = ['_main', '_save_me_aimee'] self.do_run(src, 'hello world!\n*100*\n*fivesix*\nmann\n', post_build=check) def test_inlinejs(self): @@ -3069,6 +3083,7 @@ def process(filename): def test_memorygrowth(self): if Settings.USE_TYPED_ARRAYS == 0: return self.skip('memory growth is only supported with typed arrays') + if Settings.ASM_JS: return self.skip('asm does not support memory growth yet') # With typed arrays in particular, it is dangerous to use more memory than TOTAL_MEMORY, # since we then need to enlarge the heap(s). @@ -3259,6 +3274,7 @@ def process(filename): def test_varargs(self): if Settings.QUANTUM_SIZE == 1: return self.skip('FIXME: Add support for this') + if Settings.ASM_JS: return self.skip('varargs by function pointer not yet supported') src = ''' #include <stdio.h> @@ -3913,6 +3929,7 @@ The current type of b is: 9 def test_runtimelink(self): if Building.LLVM_OPTS: return self.skip('LLVM opts will optimize printf into puts in the parent, and the child will still look for puts') if Settings.NAMED_GLOBALS == 0: return self.skip('dlopen cannot work without named globals, TODO') + if Settings.ASM_JS: return self.skip('asm does not support runtime linking') main, supp = self.setup_runtimelink_test() @@ -3928,6 +3945,8 @@ The current type of b is: 9 self.do_run(main, 'supp: 54,2\nmain: 56\nsupp see: 543\nmain see: 76\nok.') def test_dlfcn_basic(self): + if Settings.ASM_JS: return self.skip('TODO: dlopen in asm') + Settings.LINKABLE = 1 lib_src = ''' @@ -3979,6 +3998,8 @@ def process(filename): post_build=add_pre_run_and_checks) def test_dlfcn_qsort(self): + if Settings.ASM_JS: return self.skip('TODO: dlopen in asm') + Settings.LINKABLE = 1 if Settings.USE_TYPED_ARRAYS == 2: @@ -4071,6 +4092,7 @@ def process(filename): post_build=add_pre_run_and_checks) def test_dlfcn_data_and_fptr(self): + if Settings.ASM_JS: return self.skip('TODO: dlopen in asm') if Building.LLVM_OPTS: return self.skip('LLVM opts will optimize out parent_func') if Settings.NAMED_GLOBALS == 0: return self.skip('dlopen cannot work without named globals, TODO') @@ -4174,6 +4196,8 @@ def process(filename): post_build=add_pre_run_and_checks) def test_dlfcn_alias(self): + if Settings.ASM_JS: return self.skip('TODO: dlopen in asm') + Settings.LINKABLE = 1 if Building.LLVM_OPTS == 2: return self.skip('LLVM LTO will optimize away stuff we expect from the shared library') @@ -4229,6 +4253,8 @@ def process(filename): Settings.INCLUDE_FULL_LIBRARY = 0 def test_dlfcn_varargs(self): + if Settings.ASM_JS: return self.skip('TODO: dlopen in asm') + Settings.LINKABLE = 1 if Building.LLVM_OPTS == 2: return self.skip('LLVM LTO will optimize things that prevent shared objects from working') @@ -5358,6 +5384,7 @@ def process(filename): } ''' for linkable in [0, 1]: + print linkable Settings.LINKABLE = linkable # regression check for issue #273 self.do_run(src, "1 2 3") @@ -5939,7 +5966,7 @@ int main(int argc, char **argv) { Settings.CORRECT_SIGNS = 2 Settings.CORRECT_SIGNS_LINES = ['src.cpp:' + str(i+4) for i in [4816, 4191, 4246, 4199, 4205, 4235, 4227]] - Settings.TOTAL_MEMORY = 100*1024*1024 # needed with typed arrays + Settings.TOTAL_MEMORY = 128*1024*1024 # needed with typed arrays 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_run(src, '*1,0*', ['200', '1']) @@ -5954,7 +5981,7 @@ int main(int argc, char **argv) { # emcc should build in dlmalloc automatically, and do all the sign correction etc. for it try_delete(os.path.join(self.get_dir(), 'src.cpp.o.js')) - output = Popen(['python', EMCC, path_from_root('tests', 'dlmalloc_test.c'), '-s', 'TOTAL_MEMORY=100000000', + output = Popen(['python', EMCC, path_from_root('tests', 'dlmalloc_test.c'), '-s', 'TOTAL_MEMORY=' + str(128*1024*1024), '-o', os.path.join(self.get_dir(), 'src.cpp.o.js')], stdout=PIPE, stderr=self.stderr_redirect).communicate() self.do_run('x', '*1,0*', ['200', '1'], no_build=True) @@ -6141,7 +6168,7 @@ void*:16 self.do_run(src, '*10,22*') def test_mmap(self): - Settings.TOTAL_MEMORY = 100*1024*1024 + Settings.TOTAL_MEMORY = 128*1024*1024 src = ''' #include <stdio.h> @@ -6238,6 +6265,7 @@ void*:16 def test_freetype(self): if Settings.QUANTUM_SIZE == 1: return self.skip('TODO: Figure out and try to fix') + if Settings.ASM_JS: return self.skip('asm does not support longjmp') if Settings.CORRECT_SIGNS == 0: Settings.CORRECT_SIGNS = 1 # Not sure why, but needed @@ -6294,16 +6322,13 @@ def process(filename): 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') - pgo_data = read_pgo_data(path_from_root('tests', 'sqlite', 'sqlite-autooptimize.fails.txt')) - 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_LINES = pgo_data['signs_lines'] 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 Settings.DISABLE_EXCEPTION_CATCHING = 1 Settings.FAST_MEMORY = 4*1024*1024 - Settings.EXPORTED_FUNCTIONS = ['_main', '_sqlite3_open', '_sqlite3_close', '_sqlite3_exec', '_sqlite3_free', '_callback']; + Settings.EXPORTED_FUNCTIONS += ['_sqlite3_open', '_sqlite3_close', '_sqlite3_exec', '_sqlite3_free', '_callback']; self.do_run(r''' #define SQLITE_DISABLE_LFS @@ -6349,6 +6374,7 @@ def process(filename): def test_poppler(self): if self.emcc_args is None: return self.skip('very slow, we only do this in emcc runs') + if Settings.ASM_JS: return self.skip('asm does not support relying on function pointers being cast to different types') Settings.CORRECT_OVERFLOWS = 1 Settings.CORRECT_SIGNS = 1 @@ -6519,7 +6545,7 @@ def process(filename): Settings.CHECK_OVERFLOWS = 0 if self.emcc_args is None: Settings.SAFE_HEAP = 0 # Has bitfields which are false positives. Also the PyFloat_Init tries to detect endianness. Settings.CORRECT_SIGNS = 1 # Not sure why, but needed - Settings.EXPORTED_FUNCTIONS = ['_main', '_PyRun_SimpleStringFlags'] # for the demo + Settings.EXPORTED_FUNCTIONS += ['_PyRun_SimpleStringFlags'] # for the demo self.do_ll_run(path_from_root('tests', 'python', 'python.small.bc'), 'hello python world!\n[0, 2, 4, 6]\n5\n22\n5.470000', @@ -6557,6 +6583,9 @@ def process(filename): if '_ta2' in shortname and not Settings.USE_TYPED_ARRAYS == 2: print self.skip('case "%s" only relevant for ta2' % shortname) continue + if '_noasm' in shortname and Settings.ASM_JS: + print self.skip('case "%s" not relevant for asm.js' % shortname) + continue print >> sys.stderr, "Testing case '%s'..." % shortname output_file = path_from_root('tests', 'cases', shortname + '.txt') if Settings.QUANTUM_SIZE == 1: @@ -6630,6 +6659,8 @@ 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') + src = ''' #include <emscripten.h> #include <unistd.h> @@ -6734,11 +6765,13 @@ def process(filename): open(filename, 'w').write(src) ''' - Settings.EXPORTED_FUNCTIONS = ['_get_int', '_get_float', '_get_string', '_print_int', '_print_float', '_print_string', '_multi', '_pointer', '_malloc'] + Settings.EXPORTED_FUNCTIONS += ['_get_int', '_get_float', '_get_string', '_print_int', '_print_float', '_print_string', '_multi', '_pointer'] self.do_run(src, '*\nnumber,5\nnumber,3.14\nstring,hello world\n12\nundefined\n14.56\nundefined\ncheez\nundefined\narr-ay\nundefined\nmore\nnumber,10\n650\nnumber,21\n*\natr\n10\nbret\n53\n*\nstack is ok.\n', post_build=post) def test_scriptaclass(self): + if Settings.ASM_JS: return self.skip('asm does not bindings generator yet') + header_filename = os.path.join(self.get_dir(), 'header.h') header = ''' struct ScriptMe { @@ -6983,6 +7016,8 @@ Child2:9 ''', post_build=[post2, post3]) def test_scriptaclass_2(self): + if Settings.ASM_JS: return self.skip('asm does not bindings generator yet') + header_filename = os.path.join(self.get_dir(), 'header.h') header = ''' #include <stdio.h> @@ -7240,6 +7275,8 @@ def process(filename): assert 'Assertion failed' in str(e), str(e) def test_linespecific(self): + if Settings.ASM_JS: return self.skip('asm always has corrections on') + if '-g' not in Building.COMPILER_TEST_OPTS: Building.COMPILER_TEST_OPTS.append('-g') if self.emcc_args: self.emcc_args += ['--llvm-opts', '0'] # llvm full opts make the expected failures here not happen @@ -7397,6 +7434,8 @@ def process(filename): Settings.CORRECT_SIGNS = 0 def test_pgo(self): + if Settings.ASM_JS: return self.skip('asm does not support pgo') + if '-g' not in Building.COMPILER_TEST_OPTS: Building.COMPILER_TEST_OPTS.append('-g') Settings.PGO = Settings.CHECK_OVERFLOWS = Settings.CORRECT_OVERFLOWS = Settings.CHECK_SIGNS = Settings.CORRECT_SIGNS = 1 @@ -7472,6 +7511,7 @@ def process(filename): def test_gc(self): if self.emcc_args == None: return self.skip('needs ta2') + if Settings.ASM_JS: return self.skip('asm cannot support generic function table') Settings.GC_SUPPORT = 1 @@ -7654,6 +7694,10 @@ TT = %s # 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"])') + # 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"])') + # Make custom runs with various options for compiler, quantum, embetter, typed_arrays, llvm_opts in [ (CLANG, 1, 1, 0, 0), @@ -8182,6 +8226,8 @@ f.close() self.assertContained('hello from lib', run_js(os.path.join(self.get_dir(), 'a.out.js'))) def test_runtimelink_multi(self): + if Settings.ASM_JS: return self.skip('asm does not support runtime linking yet') + if SPIDERMONKEY_ENGINE not in JS_ENGINES: return self.skip('cannot run without spidermonkey due to node limitations') open('testa.h', 'w').write(r''' @@ -8694,6 +8740,10 @@ f.close() ['eliminate']), (path_from_root('tools', 'eliminator', 'safe-eliminator-test.js'), open(path_from_root('tools', 'eliminator', 'safe-eliminator-test-output.js')).read(), ['eliminateMemSafe']), + (path_from_root('tools', 'eliminator', 'asm-eliminator-test.js'), open(path_from_root('tools', 'eliminator', 'asm-eliminator-test-output.js')).read(), + ['eliminateAsm']), + (path_from_root('tools', 'test-js-optimizer-asm-regs.js'), open(path_from_root('tools', 'test-js-optimizer-asm-regs-output.js')).read(), + ['registerizeAsm']), ]: output = Popen([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')) @@ -10247,7 +10297,7 @@ elif 'benchmark' in str(sys.argv): try_delete(final_filename) output = Popen(['python', EMCC, filename, #'-O3', '-O2', '-s', 'INLINING_LIMIT=0', '-s', 'DOUBLE_MODE=0', '-s', 'PRECISE_I64_MATH=0', - '-s', 'TOTAL_MEMORY=100*1024*1024', '-s', 'FAST_MEMORY=10*1024*1024', + '-s', 'TOTAL_MEMORY=128*1024*1024', '-s', 'FAST_MEMORY=10*1024*1024', '-o', final_filename] + emcc_args, stdout=PIPE, stderr=self.stderr_redirect).communicate() assert os.path.exists(final_filename), 'Failed to compile file: ' + output[0] diff --git a/tests/sqlite/sqlite-autooptimize.fails.txt b/tests/sqlite/sqlite-autooptimize.fails.txt deleted file mode 100644 index a8fb95c9..00000000 --- a/tests/sqlite/sqlite-autooptimize.fails.txt +++ /dev/null @@ -1,3436 +0,0 @@ -UnSign|src.c:53573 : 5437030 hits, %0 failures -UnSign|src.c:48532 : 5148135 hits, %0 failures -UnSign|src.c:48527 : 5100537 hits, %0 failures -UnSign|src.c:52005 : 4073874 hits, %0 failures -UnSign|src.c:53050 : 3934072 hits, %0 failures -UnSign|src.c:18445 : 3774770 hits, %0 failures -ReSign|src.c:53625 : 3436900 hits, %0 failures -ReSign|src.c:53628 : 3425390 hits, %0 failures -UnSign|src.c:60549 : 3283684 hits, %0 failures -UnSign|src.c:60553 : 3273669 hits, %0 failures -UnSign|src.c:48406 : 3040270 hits, %0 failures -ReSign|src.c:20723 : 2661440 hits, %0 failures -ReSign|src.c:60568 : 2383652 hits, %0 failures -ReSign|src.c:57231 : 2322446 hits, %0 failures -UnSign|src.c:20762 : 2255540 hits, %0 failures -ReSign|src.c:53571 : 2197772 hits, %0 failures -ReSign|src.c:60549 : 2182456 hits, %0 failures -ReSign|src.c:60554 : 2182446 hits, %0 failures -ReSign|src.c:60562 : 2182446 hits, %0 failures -UnSign|src.c:60543 : 2096937 hits, %0 failures -ReSign|src.c:52033 : 2036931 hits, %0 failures -ReSign|src.c:104878 : 1954211 hits, %0 failures -ReSign|src.c:20762 : 1904614 hits, %0 failures -ReSign|src.c:104872 : 1779034 hits, %0 failures -ReSign|src.c:53101 : 1720386 hits, %0 failures -UnSign|src.c:48501 : 1716045 hits, %0 failures -ReSign|src.c:48513 : 1716045 hits, %0 failures -UnSign|src.c:48545 : 1716045 hits, %0 failures -UnSign|src.c:53627 : 1712695 hits, %0 failures -UnSign|src.c:53104 : 1701640 hits, %0 failures -UnSign|src.c:53106 : 1701640 hits, %0 failures -ReSign|src.c:48527 : 1700179 hits, %0 failures -ReSign|src.c:20618 : 1582657 hits, %0 failures -ReSign|src.c:82816 : 1520000 hits, %0 failures -ReSign|src.c:57232 : 1374742 hits, %0 failures -ReSign|src.c:52083 : 1357954 hits, %0 failures -ReSign|src.c:107278 : 1330720 hits, %0 failures -ReSign|src.c:18445 : 1271522 hits, %0 failures -ReSign|src.c:106763 : 1253037 hits, %0 failures -ReSign|src.c:18496 : 1251458 hits, %0 failures -ReSign|src.c:53561 : 1239128 hits, %0 failures -ReSign|src.c:48399 : 1227618 hits, %0 failures -ReSign|src.c:48394 : 1221863 hits, %0 failures -UnSign|src.c:57190 : 1161232 hits, %0 failures -UnSign|src.c:57191 : 1161232 hits, %0 failures -ReSign|src.c:57198 : 1161232 hits, %0 failures -ReSign|src.c:57206 : 1161232 hits, %0 failures -ReSign|src.c:57207 : 1161223 hits, %0 failures -ReSign|src.c:57210 : 1161223 hits, %0 failures -ReSign|src.c:57213 : 1161223 hits, %0 failures -ReSign|src.c:12957 : 1159636 hits, %0 failures -ReSign|src.c:107458 : 1127259 hits, %0 failures -ReSign|src.c:60553 : 1091223 hits, %0 failures -ReSign|src.c:60564 : 1091223 hits, %0 failures -ReSign|src.c:52086 : 1086554 hits, %0 failures -ReSign|src.c:18497 : 1071311 hits, %0 failures -ReSign|src.c:18501 : 1071311 hits, %0 failures -UnSign|src.c:48434 : 1050126 hits, %0 failures -ReSign|src.c:63375 : 1035403 hits, %0 failures -ReSign|src.c:63377 : 1035403 hits, %0 failures -ReSign|src.c:63416 : 1035403 hits, %0 failures -UnSign|src.c:63436 : 1035403 hits, %0 failures -ReSign|src.c:63436 : 1035403 hits, %0 failures -UnSign|src.c:63477 : 1035403 hits, %1 failures -UnSign|src.c:65084 : 990123 hits, %0 failures -ReSign|src.c:18476 : 983487 hits, %0 failures -UnSign|src.c:104878 : 952092 hits, %0 failures -ReSign|src.c:18631 : 951200 hits, %0 failures -ReSign|src.c:65081 : 940100 hits, %0 failures -UnSign|src.c:107411 : 902598 hits, %0 failures -UnSign|src.c:48491 : 850065 hits, %0 failures -UnSign|src.c:58216 : 800956 hits, %0 failures -UnSign|src.c:104870 : 776776 hits, %0 failures -ReSign|src.c:106658 : 776773 hits, %0 failures -ReSign|src.c:107463 : 751466 hits, %0 failures -ReSign|src.c:18639 : 750974 hits, %0 failures -ReSign|src.c:57991 : 750898 hits, %0 failures -ReSign|src.c:57712 : 750896 hits, %0 failures -UnSign|src.c:57989 : 750895 hits, %1 failures -ReSign|src.c:57989 : 750895 hits, %0 failures -ReSign|src.c:21066 : 750278 hits, %0 failures -ReSign|dlmalloc.c:4240 : 744231 hits, %0 failures -UnSign|src.c:48449 : 735069 hits, %0 failures -UnSign|src.c:21501 : 728920 hits, %0 failures -UnSign|src.c:57991 : 725878 hits, %1 failures -UnSign|src.c:58639 : 700848 hits, %0 failures -ReSign|src.c:60543 : 698979 hits, %0 failures -UnSign|src.c:60545 : 698979 hits, %0 failures -ReSign|src.c:60545 : 698979 hits, %0 failures -UnSign|src.c:60548 : 698979 hits, %0 failures -UnSign|src.c:60577 : 693974 hits, %0 failures -ReSign|src.c:60577 : 693974 hits, %0 failures -ReSign|src.c:60317 : 683799 hits, %0 failures -UnSign|src.c:60317 : 683799 hits, %0 failures -ReSign|src.c:52006 : 678979 hits, %0 failures -ReSign|src.c:52067 : 678979 hits, %0 failures -UnSign|src.c:52032 : 678977 hits, %0 failures -UnSign|src.c:52033 : 678977 hits, %0 failures -ReSign|src.c:52078 : 678977 hits, %0 failures -UnSign|src.c:107277 : 665360 hits, %0 failures -ReSign|src.c:107277 : 665360 hits, %0 failures -ReSign|src.c:20722 : 665360 hits, %0 failures -UnSign|src.c:65082 : 660082 hits, %0 failures -UnSign|src.c:65087 : 660082 hits, %0 failures -UnSign|src.c:20140 : 660000 hits, %0 failures -UnSign|src.c:20141 : 660000 hits, %0 failures -UnSign|src.c:60170 : 655075 hits, %0 failures -UnSign|src.c:56685 : 640140 hits, %0 failures -ReSign|src.c:56685 : 640140 hits, %0 failures -ReSign|src.c:62565 : 630092 hits, %0 failures -UnSign|src.c:48394 : 613809 hits, %0 failures -UnSign|src.c:48398 : 613809 hits, %0 failures -UnSign|src.c:104882 : 601752 hits, %0 failures -ReSign|src.c:62574 : 580020 hits, %0 failures -UnSign|src.c:52949 : 574492 hits, %0 failures -UnSign|src.c:65110 : 560036 hits, %0 failures -UnSign|src.c:60174 : 555027 hits, %0 failures -ReSign|src.c:35705 : 546585 hits, %0 failures -ReSign|src.c:35973 : 543546 hits, %0 failures -UnSign|src.c:60126 : 525078 hits, %0 failures -ReSign|src.c:60129 : 525078 hits, %0 failures -ReSign|src.c:60132 : 525078 hits, %0 failures -UnSign|src.c:48438 : 525063 hits, %0 failures -UnSign|src.c:104877 : 501069 hits, %0 failures -ReSign|src.c:73314 : 500922 hits, %0 failures -ReSign|src.c:58163 : 500579 hits, %0 failures -UnSign|src.c:65266 : 500064 hits, %0 failures -UnSign|src.c:65309 : 500064 hits, %0 failures -UnSign|src.c:65313 : 500064 hits, %0 failures -UnSign|src.c:60447 : 500000 hits, %0 failures -UnSign|src.c:48453 : 490046 hits, %0 failures -ReSign|src.c:106663 : 476264 hits, %0 failures -UnSign|src.c:106514 : 476264 hits, %100 failures -UnSign|src.c:106515 : 476264 hits, %0 failures -UnSign|src.c:106517 : 476264 hits, %0 failures -ReSign|src.c:104942 : 476264 hits, %0 failures -UnSign|src.c:104945 : 476264 hits, %0 failures -UnSign|src.c:104954 : 476264 hits, %0 failures -ReSign|src.c:106518 : 476264 hits, %0 failures -ReSign|src.c:106524 : 476244 hits, %0 failures -ReSign|src.c:18625 : 475798 hits, %0 failures -ReSign|src.c:18627 : 475786 hits, %0 failures -ReSign|src.c:18630 : 475786 hits, %0 failures -UnSign|src.c:18631 : 475600 hits, %0 failures -ReSign|src.c:82818 : 475000 hits, %0 failures -UnSign|src.c:82818 : 475000 hits, %0 failures -ReSign|src.c:65110 : 460036 hits, %0 failures -ReSign|src.c:107411 : 451299 hits, %0 failures -ReSign|src.c:60137 : 450024 hits, %0 failures -ReSign|src.c:60140 : 450024 hits, %0 failures -UnSign|src.c:60147 : 450024 hits, %0 failures -UnSign|src.c:34405 : 429302 hits, %0 failures -ReSign|src.c:58005 : 425545 hits, %0 failures -ReSign|src.c:60312 : 422021 hits, %0 failures -UnSign|src.c:65026 : 420027 hits, %0 failures -UnSign|src.c:48442 : 420012 hits, %0 failures -ReSign|src.c:60266 : 419766 hits, %0 failures -UnSign|src.c:51654 : 415194 hits, %0 failures -ReSign|src.c:51654 : 415194 hits, %0 failures -ReSign|src.c:104896 : 401065 hits, %0 failures -UnSign|src.c:106968 : 400964 hits, %0 failures -ReSign|src.c:104995 : 400841 hits, %0 failures -UnSign|src.c:60322 : 400822 hits, %0 failures -ReSign|src.c:57985 : 400478 hits, %0 failures -ReSign|src.c:18462 : 400410 hits, %0 failures -UnSign|src.c:107315 : 400116 hits, %0 failures -ReSign|src.c:48147 : 400016 hits, %0 failures -ReSign|src.c:60447 : 400000 hits, %0 failures -ReSign|src.c:53661 : 392936 hits, %0 failures -ReSign|src.c:51745 : 389964 hits, %0 failures -ReSign|src.c:48244 : 380058 hits, %0 failures -UnSign|src.c:107153 : 375733 hits, %0 failures -ReSign|src.c:18633 : 375487 hits, %0 failures -UnSign|src.c:57988 : 375448 hits, %1 failures -UnSign|src.c:58005 : 375448 hits, %0 failures -ReSign|src.c:58217 : 375448 hits, %7 failures -ReSign|src.c:48400 : 374580 hits, %0 failures -ReSign|src.c:14805 : 366584 hits, %0 failures -UnSign|src.c:36054 : 364390 hits, %0 failures -ReSign|src.c:34970 : 364390 hits, %0 failures -ReSign|src.c:34989 : 364390 hits, %0 failures -UnSign|src.c:35972 : 364386 hits, %0 failures -ReSign|src.c:41807 : 362867 hits, %0 failures -UnSign|src.c:49129 : 361314 hits, %0 failures -UnSign|src.c:57994 : 350436 hits, %1 failures -ReSign|src.c:57994 : 350436 hits, %0 failures -UnSign|src.c:57996 : 350436 hits, %1 failures -ReSign|src.c:57996 : 350436 hits, %0 failures -ReSign|src.c:59118 : 350374 hits, %0 failures -UnSign|src.c:65311 : 350052 hits, %0 failures -ReSign|src.c:34758 : 343676 hits, %0 failures -ReSign|src.c:65084 : 330041 hits, %0 failures -ReSign|src.c:21492 : 325038 hits, %0 failures -UnSign|src.c:60254 : 325034 hits, %0 failures -ReSign|src.c:12969 : 302946 hits, %0 failures -UnSign|src.c:60568 : 301730 hits, %0 failures -UnSign|src.c:104918 : 300533 hits, %0 failures -ReSign|src.c:106632 : 300529 hits, %0 failures -ReSign|src.c:106647 : 300529 hits, %0 failures -UnSign|src.c:106647 : 300529 hits, %0 failures -ReSign|src.c:107490 : 300491 hits, %0 failures -ReSign|src.c:18781 : 300473 hits, %0 failures -UnSign|src.c:58654 : 300370 hits, %0 failures -ReSign|src.c:58654 : 300370 hits, %0 failures -ReSign|src.c:71511 : 300360 hits, %0 failures -UnSign|src.c:60450 : 300000 hits, %0 failures -ReSign|src.c:52164 : 299700 hits, %0 failures -UnSign|src.c:60148 : 299250 hits, %0 failures -UnSign|src.c:52095 : 297650 hits, %0 failures -ReSign|dlmalloc.c:4816 : 290833 hits, %0 failures -ReSign|src.c:51102 : 286959 hits, %0 failures -ReSign|src.c:64945 : 280054 hits, %0 failures -UnSign|src.c:64981 : 280054 hits, %0 failures -ReSign|src.c:64992 : 280054 hits, %0 failures -UnSign|src.c:65016 : 280018 hits, %0 failures -ReSign|src.c:65056 : 280018 hits, %0 failures -ReSign|src.c:49151 : 277476 hits, %0 failures -UnSign|dlmalloc.c:4746 : 276872 hits, %0 failures -ReSign|src.c:51643 : 276796 hits, %0 failures -UnSign|dlmalloc.c:4776 : 276734 hits, %0 failures -UnSign|src.c:104874 : 275707 hits, %0 failures -ReSign|src.c:73312 : 275374 hits, %0 failures -ReSign|src.c:58656 : 275364 hits, %0 failures -ReSign|src.c:56504 : 275189 hits, %0 failures -ReSign|src.c:51998 : 271404 hits, %0 failures -UnSign|dlmalloc.c:4816 : 265512 hits, %0 failures -ReSign|src.c:18308 : 265362 hits, %0 failures -ReSign|src.c:53012 : 263997 hits, %0 failures -UnSign|src.c:53661 : 261628 hits, %0 failures -ReSign|src.c:71858 : 250490 hits, %0 failures -UnSign|src.c:58958 : 250308 hits, %0 failures -ReSign|src.c:58283 : 250250 hits, %0 failures -ReSign|src.c:56494 : 250226 hits, %0 failures -ReSign|src.c:56452 : 250146 hits, %0 failures -UnSign|src.c:48430 : 245023 hits, %0 failures -ReSign|src.c:48432 : 245023 hits, %0 failures -ReSign|src.c:48453 : 245023 hits, %0 failures -UnSign|src.c:53060 : 243828 hits, %0 failures -UnSign|src.c:62526 : 240010 hits, %0 failures -ReSign|src.c:62526 : 240010 hits, %0 failures -UnSign|src.c:62578 : 240010 hits, %0 failures -ReSign|src.c:62578 : 240010 hits, %0 failures -ReSign|src.c:21148 : 233522 hits, %0 failures -ReSign|dlmalloc.c:4678 : 226376 hits, %0 failures -UnSign|dlmalloc.c:4191 : 226332 hits, %0 failures -ReSign|src.c:69940 : 225884 hits, %0 failures -ReSign|src.c:106972 : 225598 hits, %0 failures -ReSign|src.c:90019 : 225198 hits, %0 failures -ReSign|src.c:85988 : 225048 hits, %0 failures -UnSign|src.c:42240 : 216588 hits, %0 failures -ReSign|src.c:37792 : 216588 hits, %0 failures -UnSign|src.c:42215 : 216588 hits, %0 failures -ReSign|src.c:51833 : 214830 hits, %0 failures -ReSign|src.c:34404 : 214651 hits, %0 failures -ReSign|src.c:42143 : 212714 hits, %0 failures -UnSign|src.c:42145 : 212714 hits, %0 failures -ReSign|src.c:82790 : 210000 hits, %0 failures -ReSign|dlmalloc.c:4778 : 208952 hits, %0 failures -UnSign|src.c:51191 : 205008 hits, %0 failures -ReSign|src.c:51191 : 205008 hits, %0 failures -UnSign|src.c:104879 : 200536 hits, %0 failures -ReSign|src.c:104879 : 200536 hits, %0 failures -UnSign|src.c:107408 : 200534 hits, %0 failures -UnSign|src.c:104895 : 200533 hits, %0 failures -UnSign|src.c:104916 : 200533 hits, %0 failures -UnSign|src.c:104896 : 200532 hits, %0 failures -ReSign|src.c:60322 : 200411 hits, %0 failures -ReSign|src.c:59190 : 200248 hits, %0 failures -ReSign|src.c:72334 : 200194 hits, %0 failures -ReSign|src.c:91875 : 200136 hits, %0 failures -ReSign|src.c:86205 : 200064 hits, %0 failures -ReSign|src.c:107315 : 200058 hits, %0 failures -ReSign|src.c:85709 : 200040 hits, %0 failures -ReSign|src.c:85965 : 200040 hits, %0 failures -ReSign|src.c:48146 : 200018 hits, %0 failures -UnSign|src.c:51212 : 200018 hits, %0 failures -ReSign|src.c:51212 : 200018 hits, %0 failures -ReSign|dlmalloc.c:4215 : 197420 hits, %0 failures -UnSign|dlmalloc.c:4199 : 190700 hits, %43 failures -ReSign|src.c:56535 : 190085 hits, %0 failures -ReSign|src.c:60052 : 190029 hits, %0 failures -ReSign|src.c:60068 : 190029 hits, %0 failures -UnSign|src.c:48239 : 190029 hits, %0 failures -ReSign|src.c:48239 : 190029 hits, %0 failures -ReSign|src.c:48240 : 190029 hits, %0 failures -UnSign|src.c:48244 : 190029 hits, %0 failures -ReSign|src.c:60071 : 190029 hits, %0 failures -ReSign|src.c:60072 : 190029 hits, %0 failures -ReSign|dlmalloc.c:4799 : 186357 hits, %0 failures -ReSign|src.c:35977 : 183718 hits, %0 failures -ReSign|src.c:34904 : 182197 hits, %0 failures -ReSign|src.c:41785 : 182195 hits, %0 failures -ReSign|src.c:41791 : 182195 hits, %0 failures -ReSign|src.c:34916 : 182195 hits, %0 failures -UnSign|src.c:34916 : 182195 hits, %0 failures -ReSign|src.c:34917 : 182195 hits, %0 failures -UnSign|src.c:35971 : 182195 hits, %0 failures -ReSign|src.c:36054 : 182195 hits, %0 failures -ReSign|src.c:36058 : 182195 hits, %0 failures -ReSign|src.c:34921 : 182195 hits, %0 failures -ReSign|src.c:34956 : 182195 hits, %0 failures -ReSign|src.c:34957 : 182195 hits, %0 failures -ReSign|src.c:34974 : 182195 hits, %0 failures -ReSign|src.c:34979 : 182195 hits, %0 failures -ReSign|src.c:41797 : 182195 hits, %0 failures -ReSign|src.c:49080 : 182195 hits, %0 failures -ReSign|src.c:49054 : 182195 hits, %0 failures -ReSign|src.c:41905 : 182195 hits, %0 failures -ReSign|src.c:41718 : 182195 hits, %0 failures -ReSign|src.c:35701 : 182195 hits, %0 failures -ReSign|src.c:48911 : 180663 hits, %0 failures -ReSign|src.c:49133 : 180657 hits, %0 failures -ReSign|src.c:49135 : 180657 hits, %0 failures -UnSign|src.c:48715 : 177520 hits, %0 failures -UnSign|src.c:34992 : 176430 hits, %0 failures -ReSign|src.c:34992 : 176430 hits, %0 failures -UnSign|src.c:53012 : 175998 hits, %0 failures -ReSign|src.c:18596 : 175318 hits, %0 failures -ReSign|src.c:58629 : 175222 hits, %0 failures -ReSign|src.c:56507 : 175111 hits, %0 failures -UnSign|src.c:56452 : 175099 hits, %0 failures -ReSign|src.c:65268 : 175026 hits, %0 failures -ReSign|src.c:65269 : 175026 hits, %0 failures -UnSign|src.c:65271 : 175026 hits, %0 failures -ReSign|src.c:65271 : 175026 hits, %0 failures -UnSign|src.c:65278 : 175026 hits, %0 failures -ReSign|src.c:65278 : 175026 hits, %0 failures -ReSign|src.c:65282 : 175026 hits, %0 failures -UnSign|src.c:21197 : 175023 hits, %0 failures -ReSign|src.c:21199 : 175023 hits, %0 failures -ReSign|src.c:48433 : 175021 hits, %0 failures -ReSign|src.c:48434 : 175021 hits, %0 failures -UnSign|src.c:21206 : 174110 hits, %0 failures -ReSign|src.c:21208 : 174110 hits, %0 failures -ReSign|src.c:34802 : 171875 hits, %0 failures -ReSign|src.c:34794 : 171838 hits, %0 failures -ReSign|src.c:34799 : 171838 hits, %0 failures -ReSign|src.c:34766 : 171838 hits, %0 failures -ReSign|src.c:34772 : 171838 hits, %0 failures -ReSign|src.c:52092 : 171400 hits, %0 failures -UnSign|src.c:51953 : 169341 hits, %0 failures -ReSign|src.c:51953 : 169341 hits, %0 failures -UnSign|src.c:48697 : 162552 hits, %0 failures -UnSign|src.c:48698 : 162552 hits, %0 failures -ReSign|src.c:48699 : 162552 hits, %0 failures -ReSign|src.c:48709 : 162552 hits, %0 failures -UnSign|src.c:53042 : 162552 hits, %0 failures -UnSign|dlmalloc.c:4235 : 161074 hits, %50 failures -UnSign|dlmalloc.c:4236 : 161072 hits, %0 failures -UnSign|dlmalloc.c:4239 : 161072 hits, %0 failures -ReSign|src.c:51566 : 160011 hits, %0 failures -UnSign|src.c:51568 : 160011 hits, %0 failures -ReSign|src.c:51568 : 160011 hits, %0 failures -UnSign|src.c:51573 : 160011 hits, %0 failures -ReSign|src.c:51574 : 160011 hits, %0 failures -ReSign|src.c:51579 : 160011 hits, %0 failures -ReSign|dlmalloc.c:4790 : 159632 hits, %0 failures -ReSign|dlmalloc.c:4225 : 156108 hits, %0 failures -ReSign|src.c:69944 : 150695 hits, %0 failures -UnSign|src.c:107160 : 150564 hits, %0 failures -UnSign|src.c:106972 : 150356 hits, %0 failures -ReSign|src.c:74962 : 150255 hits, %0 failures -ReSign|src.c:71530 : 150220 hits, %0 failures -UnSign|src.c:71864 : 150218 hits, %0 failures -ReSign|src.c:71864 : 150218 hits, %0 failures -ReSign|src.c:47514 : 150204 hits, %0 failures -ReSign|src.c:20644 : 150182 hits, %0 failures -ReSign|src.c:90198 : 150180 hits, %0 failures -ReSign|src.c:80587 : 150144 hits, %0 failures -ReSign|src.c:71202 : 150142 hits, %0 failures -UnSign|src.c:71210 : 150142 hits, %0 failures -ReSign|src.c:86929 : 150132 hits, %0 failures -ReSign|src.c:72233 : 150132 hits, %0 failures -ReSign|src.c:61132 : 150132 hits, %0 failures -ReSign|src.c:77513 : 150120 hits, %0 failures -ReSign|src.c:70643 : 150118 hits, %0 failures -UnSign|src.c:57375 : 150094 hits, %0 failures -UnSign|src.c:57393 : 150094 hits, %0 failures -ReSign|src.c:57393 : 150094 hits, %0 failures -ReSign|src.c:74130 : 150056 hits, %0 failures -ReSign|src.c:86206 : 150052 hits, %0 failures -ReSign|src.c:51743 : 150052 hits, %0 failures -ReSign|src.c:74135 : 150044 hits, %0 failures -ReSign|src.c:85967 : 150032 hits, %0 failures -ReSign|src.c:54323 : 150016 hits, %0 failures -ReSign|src.c:52823 : 150014 hits, %0 failures -ReSign|src.c:65289 : 150012 hits, %0 failures -ReSign|src.c:65293 : 150012 hits, %0 failures -UnSign|src.c:65308 : 150012 hits, %0 failures -ReSign|src.c:52878 : 150012 hits, %0 failures -ReSign|src.c:52890 : 150012 hits, %0 failures -ReSign|src.c:60257 : 150008 hits, %0 failures -ReSign|src.c:64149 : 150000 hits, %0 failures -UnSign|src.c:60444 : 150000 hits, %0 failures -UnSign|src.c:52141 : 149850 hits, %0 failures -ReSign|src.c:52141 : 149850 hits, %0 failures -ReSign|src.c:52142 : 149850 hits, %0 failures -UnSign|src.c:52146 : 149850 hits, %0 failures -ReSign|src.c:52146 : 149850 hits, %0 failures -ReSign|src.c:52150 : 149850 hits, %0 failures -ReSign|src.c:52157 : 149850 hits, %0 failures -ReSign|src.c:52158 : 149850 hits, %0 failures -UnSign|src.c:52158 : 149850 hits, %0 failures -UnSign|src.c:52164 : 149850 hits, %0 failures -ReSign|src.c:67157 : 145009 hits, %0 failures -ReSign|src.c:67161 : 145009 hits, %0 failures -ReSign|src.c:67165 : 145009 hits, %0 failures -UnSign|src.c:67171 : 145009 hits, %0 failures -ReSign|src.c:67171 : 145009 hits, %0 failures -ReSign|src.c:67175 : 145009 hits, %0 failures -ReSign|src.c:67177 : 144999 hits, %0 failures -ReSign|src.c:52190 : 144727 hits, %0 failures -ReSign|src.c:48747 : 143902 hits, %0 failures -UnSign|src.c:56533 : 140047 hits, %0 failures -ReSign|src.c:56533 : 140047 hits, %0 failures -UnSign|src.c:56534 : 140047 hits, %0 failures -UnSign|src.c:64918 : 140027 hits, %0 failures -ReSign|src.c:64939 : 140027 hits, %0 failures -ReSign|src.c:64942 : 140027 hits, %0 failures -ReSign|src.c:64943 : 140027 hits, %0 failures -ReSign|src.c:64976 : 140027 hits, %0 failures -ReSign|src.c:65123 : 140027 hits, %0 failures -ReSign|src.c:65125 : 140027 hits, %0 failures -ReSign|src.c:65152 : 140027 hits, %0 failures -UnSign|src.c:64561 : 140018 hits, %0 failures -UnSign|src.c:64618 : 140018 hits, %0 failures -UnSign|src.c:64619 : 140018 hits, %0 failures -ReSign|src.c:64948 : 140009 hits, %0 failures -ReSign|src.c:65002 : 140009 hits, %0 failures -ReSign|src.c:65005 : 140009 hits, %0 failures -ReSign|src.c:65026 : 140009 hits, %0 failures -UnSign|src.c:65037 : 140009 hits, %0 failures -ReSign|src.c:65064 : 140009 hits, %0 failures -ReSign|src.c:18277 : 138436 hits, %0 failures -UnSign|dlmalloc.c:4621 : 138436 hits, %0 failures -ReSign|src.c:14774 : 138436 hits, %0 failures -ReSign|src.c:18293 : 138436 hits, %0 failures -ReSign|dlmalloc.c:4733 : 138436 hits, %0 failures -ReSign|dlmalloc.c:4746 : 138436 hits, %0 failures -ReSign|dlmalloc.c:4749 : 138436 hits, %0 failures -ReSign|src.c:51636 : 138398 hits, %0 failures -ReSign|src.c:51647 : 138398 hits, %0 failures -ReSign|dlmalloc.c:4776 : 138367 hits, %0 failures -ReSign|dlmalloc.c:4777 : 138367 hits, %0 failures -ReSign|src.c:51982 : 135702 hits, %0 failures -UnSign|src.c:51994 : 135702 hits, %0 failures -ReSign|src.c:51995 : 135702 hits, %0 failures -ReSign|src.c:52090 : 135700 hits, %0 failures -ReSign|src.c:52097 : 135700 hits, %0 failures -ReSign|src.c:21145 : 133506 hits, %0 failures -ReSign|src.c:18317 : 132681 hits, %0 failures -ReSign|src.c:18479 : 132681 hits, %0 failures -ReSign|src.c:54292 : 126028 hits, %0 failures -ReSign|src.c:20617 : 125321 hits, %0 failures -ReSign|src.c:21857 : 125288 hits, %0 failures -ReSign|src.c:21858 : 125283 hits, %0 failures -ReSign|src.c:18733 : 125219 hits, %0 failures -ReSign|src.c:18738 : 125203 hits, %0 failures -ReSign|src.c:58956 : 125170 hits, %0 failures -UnSign|src.c:58283 : 125125 hits, %0 failures -ReSign|src.c:58291 : 125125 hits, %0 failures -ReSign|src.c:58295 : 125125 hits, %0 failures -ReSign|src.c:58297 : 125125 hits, %0 failures -ReSign|src.c:86953 : 125124 hits, %0 failures -ReSign|src.c:56493 : 125113 hits, %0 failures -UnSign|src.c:56507 : 125113 hits, %0 failures -ReSign|src.c:56512 : 125113 hits, %0 failures -UnSign|src.c:56515 : 125113 hits, %0 failures -ReSign|src.c:56518 : 125113 hits, %0 failures -ReSign|src.c:71630 : 125101 hits, %0 failures -ReSign|src.c:104840 : 125090 hits, %0 failures -UnSign|src.c:18463 : 125057 hits, %0 failures -UnSign|src.c:51618 : 125009 hits, %0 failures -ReSign|src.c:51618 : 125009 hits, %0 failures -UnSign|src.c:51581 : 125009 hits, %0 failures -ReSign|src.c:82791 : 120000 hits, %0 failures -ReSign|src.c:82829 : 120000 hits, %0 failures -UnSign|src.c:53662 : 119285 hits, %0 failures -UnSign|src.c:53663 : 119285 hits, %0 failures -UnSign|dlmalloc.c:4684 : 115690 hits, %0 failures -UnSign|dlmalloc.c:4674 : 113210 hits, %0 failures -ReSign|dlmalloc.c:4191 : 113166 hits, %0 failures -ReSign|dlmalloc.c:4192 : 113166 hits, %0 failures -ReSign|dlmalloc.c:4235 : 113166 hits, %0 failures -ReSign|src.c:42135 : 110231 hits, %0 failures -UnSign|src.c:51188 : 110004 hits, %0 failures -ReSign|src.c:51188 : 110004 hits, %0 failures -UnSign|dlmalloc.c:4246 : 109879 hits, %0 failures -ReSign|dlmalloc.c:4801 : 109584 hits, %0 failures -UnSign|src.c:42246 : 108294 hits, %0 failures -ReSign|src.c:42107 : 108294 hits, %0 failures -ReSign|src.c:42111 : 108294 hits, %0 failures -UnSign|src.c:42124 : 108294 hits, %0 failures -ReSign|src.c:42124 : 108294 hits, %0 failures -UnSign|src.c:35034 : 108294 hits, %0 failures -UnSign|src.c:35036 : 108294 hits, %0 failures -ReSign|src.c:35036 : 108294 hits, %0 failures -ReSign|src.c:37580 : 106445 hits, %0 failures -UnSign|src.c:37580 : 106445 hits, %0 failures -ReSign|src.c:42208 : 106357 hits, %0 failures -UnSign|src.c:42194 : 106351 hits, %0 failures -ReSign|src.c:42194 : 106351 hits, %0 failures -UnSign|src.c:42195 : 106351 hits, %0 failures -ReSign|dlmalloc.c:4246 : 104139 hits, %0 failures -ReSign|dlmalloc.c:4206 : 103611 hits, %0 failures -UnSign|src.c:48824 : 103034 hits, %0 failures -UnSign|dlmalloc.c:4240 : 101712 hits, %0 failures -ReSign|src.c:71649 : 100442 hits, %0 failures -UnSign|src.c:106971 : 100379 hits, %0 failures -ReSign|src.c:106971 : 100379 hits, %0 failures -ReSign|src.c:104882 : 100340 hits, %0 failures -ReSign|src.c:18652 : 100311 hits, %0 failures -ReSign|src.c:20763 : 100281 hits, %0 failures -ReSign|src.c:107408 : 100267 hits, %0 failures -ReSign|src.c:106967 : 100267 hits, %0 failures -ReSign|src.c:106968 : 100241 hits, %0 failures -ReSign|src.c:90137 : 100202 hits, %0 failures -ReSign|src.c:90138 : 100202 hits, %0 failures -ReSign|src.c:77634 : 100188 hits, %0 failures -ReSign|src.c:72331 : 100168 hits, %0 failures -ReSign|src.c:18786 : 100159 hits, %0 failures -UnSign|src.c:18781 : 100157 hits, %0 failures -ReSign|src.c:20724 : 100140 hits, %0 failures -ReSign|src.c:107498 : 100136 hits, %0 failures -UnSign|src.c:59190 : 100124 hits, %0 failures -UnSign|src.c:18668 : 100122 hits, %0 failures -ReSign|src.c:18668 : 100122 hits, %0 failures -ReSign|src.c:18669 : 100122 hits, %0 failures -ReSign|src.c:80463 : 100096 hits, %0 failures -ReSign|src.c:80487 : 100096 hits, %0 failures -ReSign|src.c:58302 : 100091 hits, %0 failures -ReSign|src.c:58305 : 100091 hits, %0 failures -ReSign|src.c:58326 : 100091 hits, %0 failures -ReSign|src.c:59709 : 100088 hits, %0 failures -ReSign|src.c:77464 : 100084 hits, %0 failures -ReSign|src.c:58329 : 100081 hits, %0 failures -ReSign|src.c:58334 : 100081 hits, %0 failures -ReSign|src.c:104806 : 100076 hits, %0 failures -UnSign|src.c:104711 : 100076 hits, %0 failures -UnSign|src.c:104817 : 100076 hits, %0 failures -ReSign|src.c:65778 : 100056 hits, %0 failures -ReSign|src.c:21059 : 100048 hits, %0 failures -ReSign|src.c:21062 : 100048 hits, %0 failures -ReSign|src.c:21065 : 100048 hits, %0 failures -UnSign|src.c:60171 : 100048 hits, %0 failures -UnSign|src.c:107322 : 100028 hits, %0 failures -ReSign|src.c:107322 : 100028 hits, %0 failures -UnSign|src.c:107332 : 100028 hits, %0 failures -ReSign|src.c:51067 : 100028 hits, %0 failures -ReSign|src.c:51068 : 100028 hits, %0 failures -ReSign|src.c:21132 : 100016 hits, %0 failures -UnSign|src.c:21146 : 100016 hits, %0 failures -ReSign|src.c:85724 : 100016 hits, %0 failures -ReSign|src.c:60432 : 100000 hits, %0 failures -ReSign|src.c:60450 : 100000 hits, %0 failures -ReSign|src.c:52811 : 100000 hits, %0 failures -ReSign|src.c:48830 : 94673 hits, %0 failures -ReSign|src.c:68079 : 90000 hits, %0 failures -ReSign|src.c:83531 : 90000 hits, %0 failures -ReSign|src.c:48715 : 88760 hits, %0 failures -UnSign|dlmalloc.c:4810 : 88677 hits, %0 failures -ReSign|dlmalloc.c:4818 : 88552 hits, %0 failures -ReSign|src.c:52998 : 87999 hits, %0 failures -ReSign|src.c:53000 : 87999 hits, %0 failures -UnSign|dlmalloc.c:4227 : 85884 hits, %17 failures -UnSign|src.c:52092 : 85700 hits, %0 failures -ReSign|src.c:52103 : 85700 hits, %0 failures -ReSign|src.c:52107 : 85700 hits, %0 failures -ReSign|dlmalloc.c:4201 : 85299 hits, %0 failures -ReSign|src.c:53026 : 81276 hits, %0 failures -UnSign|src.c:53032 : 81276 hits, %0 failures -UnSign|src.c:53033 : 81276 hits, %0 failures -UnSign|src.c:48678 : 81276 hits, %0 failures -UnSign|src.c:48695 : 81276 hits, %0 failures -ReSign|src.c:48704 : 81276 hits, %0 failures -ReSign|src.c:53036 : 81276 hits, %0 failures -ReSign|src.c:53044 : 81276 hits, %0 failures -ReSign|src.c:53062 : 81276 hits, %0 failures -UnSign|dlmalloc.c:4241 : 80536 hits, %0 failures -UnSign|src.c:53476 : 80360 hits, %0 failures -UnSign|src.c:48828 : 80070 hits, %0 failures -UnSign|src.c:48829 : 80070 hits, %0 failures -ReSign|src.c:82833 : 80000 hits, %0 failures -ReSign|src.c:82865 : 80000 hits, %0 failures -ReSign|src.c:82873 : 80000 hits, %0 failures -ReSign|src.c:69964 : 75350 hits, %0 failures -UnSign|src.c:69944 : 75292 hits, %0 failures -ReSign|src.c:69946 : 75292 hits, %0 failures -ReSign|src.c:107160 : 75282 hits, %0 failures -ReSign|src.c:69947 : 75258 hits, %0 failures -UnSign|src.c:69948 : 75258 hits, %0 failures -ReSign|src.c:69948 : 75258 hits, %0 failures -ReSign|src.c:69951 : 75258 hits, %0 failures -ReSign|src.c:107469 : 75242 hits, %0 failures -ReSign|src.c:59645 : 75162 hits, %0 failures -ReSign|src.c:57110 : 75146 hits, %0 failures -ReSign|src.c:71182 : 75118 hits, %0 failures -ReSign|src.c:71629 : 75109 hits, %0 failures -ReSign|src.c:71637 : 75109 hits, %0 failures -ReSign|src.c:71640 : 75109 hits, %0 failures -UnSign|src.c:71568 : 75109 hits, %0 failures -ReSign|src.c:71568 : 75109 hits, %0 failures -ReSign|src.c:71537 : 75109 hits, %0 failures -UnSign|src.c:70483 : 75109 hits, %0 failures -ReSign|src.c:70483 : 75109 hits, %0 failures -UnSign|src.c:70484 : 75109 hits, %0 failures -UnSign|src.c:70494 : 75109 hits, %0 failures -UnSign|src.c:71861 : 75109 hits, %0 failures -ReSign|src.c:71861 : 75109 hits, %0 failures -UnSign|src.c:71867 : 75109 hits, %0 failures -ReSign|src.c:71867 : 75109 hits, %0 failures -UnSign|src.c:71873 : 75109 hits, %0 failures -ReSign|src.c:71873 : 75109 hits, %0 failures -UnSign|src.c:107094 : 75104 hits, %0 failures -ReSign|src.c:71690 : 75101 hits, %0 failures -ReSign|src.c:71695 : 75101 hits, %0 failures -ReSign|src.c:71702 : 75101 hits, %0 failures -ReSign|src.c:71729 : 75101 hits, %0 failures -UnSign|src.c:56896 : 75097 hits, %0 failures -ReSign|src.c:56896 : 75097 hits, %0 failures -UnSign|src.c:56901 : 75097 hits, %0 failures -ReSign|src.c:56901 : 75097 hits, %0 failures -UnSign|src.c:56904 : 75097 hits, %0 failures -ReSign|src.c:71641 : 75091 hits, %0 failures -ReSign|src.c:20646 : 75090 hits, %0 failures -ReSign|src.c:57540 : 75090 hits, %0 failures -ReSign|src.c:77553 : 75090 hits, %0 failures -ReSign|src.c:90255 : 75090 hits, %0 failures -ReSign|src.c:90282 : 75090 hits, %0 failures -ReSign|src.c:73511 : 75086 hits, %0 failures -ReSign|src.c:73516 : 75086 hits, %0 failures -UnSign|src.c:73519 : 75086 hits, %1 failures -ReSign|src.c:77872 : 75084 hits, %0 failures -ReSign|src.c:77871 : 75072 hits, %0 failures -ReSign|src.c:80480 : 75072 hits, %0 failures -ReSign|src.c:51762 : 75072 hits, %0 failures -UnSign|src.c:56585 : 75072 hits, %0 failures -ReSign|src.c:56585 : 75072 hits, %0 failures -ReSign|src.c:71186 : 75071 hits, %0 failures -UnSign|src.c:71192 : 75071 hits, %0 failures -ReSign|src.c:71205 : 75071 hits, %0 failures -ReSign|src.c:71210 : 75071 hits, %0 failures -ReSign|src.c:72226 : 75066 hits, %0 failures -ReSign|src.c:90032 : 75066 hits, %0 failures -ReSign|src.c:71207 : 75064 hits, %0 failures -UnSign|src.c:70643 : 75059 hits, %0 failures -ReSign|src.c:60154 : 75054 hits, %0 failures -ReSign|src.c:60159 : 75054 hits, %0 failures -ReSign|src.c:60163 : 75054 hits, %0 failures -UnSign|src.c:60163 : 75054 hits, %0 failures -ReSign|src.c:57365 : 75047 hits, %0 failures -UnSign|src.c:57371 : 75047 hits, %0 failures -ReSign|src.c:57371 : 75047 hits, %0 failures -UnSign|src.c:57376 : 75047 hits, %0 failures -ReSign|src.c:57376 : 75047 hits, %0 failures -UnSign|src.c:57377 : 75047 hits, %0 failures -ReSign|src.c:57377 : 75047 hits, %0 failures -ReSign|src.c:51782 : 75036 hits, %0 failures -UnSign|src.c:105942 : 75035 hits, %0 failures -ReSign|src.c:58338 : 75035 hits, %0 failures -UnSign|src.c:57378 : 75032 hits, %0 failures -UnSign|src.c:57379 : 75032 hits, %0 failures -ReSign|src.c:57379 : 75032 hits, %0 failures -UnSign|src.c:74130 : 75028 hits, %1 failures -UnSign|src.c:86209 : 75026 hits, %0 failures -ReSign|src.c:86210 : 75026 hits, %0 failures -UnSign|src.c:51735 : 75026 hits, %0 failures -ReSign|src.c:51735 : 75026 hits, %0 failures -UnSign|src.c:51782 : 75026 hits, %0 failures -UnSign|src.c:51789 : 75026 hits, %0 failures -ReSign|src.c:51789 : 75026 hits, %0 failures -ReSign|src.c:85710 : 75016 hits, %0 failures -ReSign|src.c:85975 : 75016 hits, %0 failures -ReSign|src.c:85976 : 75016 hits, %0 failures -ReSign|src.c:85990 : 75016 hits, %0 failures -ReSign|src.c:85992 : 75016 hits, %0 failures -UnSign|src.c:54219 : 75008 hits, %0 failures -ReSign|src.c:54219 : 75008 hits, %0 failures -ReSign|src.c:54238 : 75008 hits, %0 failures -ReSign|src.c:54254 : 75008 hits, %0 failures -ReSign|src.c:54255 : 75008 hits, %0 failures -ReSign|src.c:48184 : 75008 hits, %0 failures -ReSign|src.c:48193 : 75008 hits, %0 failures -ReSign|src.c:54257 : 75008 hits, %0 failures -ReSign|src.c:54261 : 75008 hits, %0 failures -ReSign|src.c:49527 : 75008 hits, %0 failures -ReSign|src.c:54271 : 75008 hits, %0 failures -ReSign|src.c:52790 : 75008 hits, %0 failures -ReSign|src.c:52793 : 75008 hits, %0 failures -ReSign|src.c:52806 : 75008 hits, %0 failures -UnSign|src.c:52818 : 75008 hits, %0 failures -UnSign|src.c:52819 : 75008 hits, %0 failures -UnSign|src.c:52821 : 75008 hits, %0 failures -ReSign|src.c:54273 : 75008 hits, %0 failures -ReSign|src.c:54276 : 75008 hits, %0 failures -UnSign|src.c:54276 : 75008 hits, %0 failures -ReSign|src.c:54277 : 75008 hits, %0 failures -UnSign|src.c:54323 : 75008 hits, %0 failures -UnSign|src.c:65256 : 75006 hits, %0 failures -ReSign|src.c:65302 : 75006 hits, %0 failures -ReSign|src.c:65322 : 75006 hits, %0 failures -ReSign|src.c:52824 : 75006 hits, %0 failures -ReSign|src.c:52889 : 75006 hits, %0 failures -ReSign|src.c:52901 : 75006 hits, %0 failures -ReSign|src.c:51960 : 75006 hits, %0 failures -UnSign|src.c:67177 : 75001 hits, %0 failures -UnSign|src.c:48525 : 73841 hits, %0 failures -UnSign|dlmalloc.c:4799 : 73506 hits, %0 failures -ReSign|dlmalloc.c:4194 : 70273 hits, %0 failures -ReSign|src.c:64561 : 70009 hits, %0 failures -UnSign|src.c:64586 : 70009 hits, %0 failures -ReSign|src.c:64587 : 70009 hits, %0 failures -ReSign|src.c:64590 : 70009 hits, %0 failures -UnSign|src.c:64594 : 70009 hits, %0 failures -ReSign|src.c:64594 : 70009 hits, %0 failures -UnSign|src.c:64595 : 70009 hits, %0 failures -ReSign|src.c:64595 : 70009 hits, %0 failures -UnSign|src.c:64598 : 70009 hits, %0 failures -UnSign|src.c:64607 : 70009 hits, %0 failures -ReSign|src.c:64607 : 70009 hits, %0 failures -ReSign|src.c:64613 : 70009 hits, %0 failures -ReSign|src.c:48442 : 70002 hits, %0 failures -ReSign|src.c:82789 : 70000 hits, %0 failures -UnSign|src.c:82790 : 70000 hits, %0 failures -UnSign|dlmalloc.c:4220 : 69355 hits, %0 failures -UnSign|src.c:52938 : 68892 hits, %0 failures -ReSign|src.c:48717 : 67236 hits, %0 failures -ReSign|dlmalloc.c:4208 : 66565 hits, %0 failures -UnSign|dlmalloc.c:4704 : 65468 hits, %0 failures -ReSign|src.c:53744 : 61694 hits, %0 failures -UnSign|src.c:21223 : 60318 hits, %0 failures -ReSign|src.c:21225 : 60318 hits, %0 failures -ReSign|src.c:57330 : 60006 hits, %0 failures -UnSign|src.c:60149 : 60000 hits, %0 failures -UnSign|src.c:82791 : 60000 hits, %0 failures -ReSign|src.c:48824 : 51517 hits, %0 failures -UnSign|src.c:54292 : 51022 hits, %0 failures -ReSign|src.c:54294 : 51016 hits, %0 failures -UnSign|src.c:54294 : 51016 hits, %0 failures -UnSign|dlmalloc.c:4641 : 50388 hits, %0 failures -ReSign|src.c:20713 : 50165 hits, %0 failures -ReSign|src.c:20715 : 50149 hits, %0 failures -ReSign|src.c:56495 : 50142 hits, %0 failures -ReSign|src.c:77942 : 50140 hits, %0 failures -ReSign|src.c:77636 : 50136 hits, %0 failures -ReSign|src.c:57812 : 50134 hits, %0 failures -ReSign|src.c:21849 : 50112 hits, %0 failures -ReSign|src.c:59750 : 50107 hits, %0 failures -UnSign|src.c:77312 : 50106 hits, %0 failures -ReSign|src.c:77312 : 50106 hits, %0 failures -ReSign|src.c:90136 : 50099 hits, %0 failures -ReSign|src.c:21911 : 50096 hits, %0 failures -ReSign|src.c:21917 : 50096 hits, %0 failures -ReSign|src.c:77635 : 50082 hits, %0 failures -ReSign|src.c:59192 : 50072 hits, %0 failures -ReSign|src.c:107279 : 50070 hits, %0 failures -ReSign|src.c:47516 : 50068 hits, %0 failures -ReSign|src.c:107525 : 50068 hits, %0 failures -UnSign|src.c:59068 : 50064 hits, %0 failures -ReSign|src.c:107515 : 50064 hits, %0 failures -ReSign|src.c:90589 : 50064 hits, %0 failures -ReSign|src.c:90200 : 50060 hits, %0 failures -ReSign|src.c:59105 : 50060 hits, %0 failures -ReSign|src.c:60007 : 50060 hits, %0 failures -ReSign|src.c:77430 : 50060 hits, %0 failures -ReSign|src.c:58109 : 50060 hits, %0 failures -ReSign|src.c:61194 : 50057 hits, %0 failures -ReSign|src.c:61234 : 50057 hits, %0 failures -ReSign|src.c:77639 : 50056 hits, %0 failures -ReSign|src.c:58633 : 50054 hits, %0 failures -ReSign|src.c:21579 : 50052 hits, %0 failures -ReSign|src.c:21584 : 50052 hits, %0 failures -ReSign|src.c:59963 : 50052 hits, %0 failures -ReSign|src.c:59688 : 50052 hits, %0 failures -ReSign|src.c:59180 : 50052 hits, %0 failures -ReSign|src.c:59188 : 50052 hits, %0 failures -ReSign|src.c:59198 : 50052 hits, %0 failures -ReSign|src.c:59201 : 50052 hits, %0 failures -ReSign|src.c:59692 : 50052 hits, %0 failures -ReSign|src.c:65906 : 50052 hits, %0 failures -ReSign|src.c:65935 : 50052 hits, %0 failures -ReSign|src.c:63711 : 50050 hits, %0 failures -ReSign|src.c:90020 : 50048 hits, %0 failures -ReSign|src.c:80483 : 50048 hits, %0 failures -UnSign|src.c:51762 : 50048 hits, %0 failures -UnSign|src.c:90020 : 50044 hits, %0 failures -ReSign|src.c:50178 : 50044 hits, %0 failures -ReSign|src.c:80549 : 50044 hits, %0 failures -ReSign|src.c:93606 : 50044 hits, %0 failures -ReSign|src.c:63522 : 50044 hits, %0 failures -ReSign|src.c:65910 : 50044 hits, %0 failures -ReSign|src.c:61134 : 50044 hits, %0 failures -ReSign|src.c:61136 : 50044 hits, %0 failures -UnSign|src.c:86994 : 50044 hits, %0 failures -ReSign|src.c:90042 : 50044 hits, %0 failures -ReSign|src.c:18704 : 50042 hits, %0 failures -ReSign|src.c:77514 : 50040 hits, %0 failures -ReSign|src.c:77527 : 50040 hits, %0 failures -ReSign|src.c:63604 : 50040 hits, %0 failures -ReSign|src.c:50991 : 50036 hits, %0 failures -ReSign|src.c:80408 : 50028 hits, %0 failures -ReSign|src.c:65647 : 50026 hits, %0 failures -UnSign|src.c:62442 : 50025 hits, %0 failures -ReSign|src.c:62443 : 50025 hits, %0 failures -ReSign|src.c:62446 : 50025 hits, %0 failures -ReSign|src.c:21076 : 50024 hits, %0 failures -ReSign|src.c:21080 : 50024 hits, %0 failures -ReSign|src.c:21083 : 50024 hits, %0 failures -UnSign|src.c:65883 : 50020 hits, %50 failures -ReSign|src.c:65883 : 50020 hits, %0 failures -ReSign|src.c:48000 : 50016 hits, %0 failures -ReSign|src.c:66790 : 50016 hits, %0 failures -ReSign|src.c:51956 : 50016 hits, %0 failures -ReSign|src.c:56690 : 50016 hits, %0 failures -UnSign|src.c:107317 : 50014 hits, %0 failures -ReSign|src.c:107317 : 50014 hits, %0 failures -ReSign|src.c:107332 : 50014 hits, %0 failures -ReSign|src.c:95210 : 50012 hits, %0 failures -ReSign|src.c:81648 : 50012 hits, %0 failures -ReSign|src.c:42912 : 50012 hits, %0 failures -ReSign|src.c:62449 : 50010 hits, %0 failures -ReSign|src.c:62452 : 50010 hits, %0 failures -ReSign|src.c:71631 : 50010 hits, %0 failures -UnSign|src.c:71642 : 50010 hits, %0 failures -UnSign|src.c:73192 : 50010 hits, %0 failures -ReSign|src.c:73192 : 50010 hits, %0 failures -ReSign|src.c:73195 : 50010 hits, %0 failures -ReSign|src.c:51967 : 50008 hits, %0 failures -UnSign|src.c:51973 : 50008 hits, %0 failures -ReSign|src.c:51973 : 50008 hits, %0 failures -ReSign|src.c:85516 : 50008 hits, %0 failures -ReSign|src.c:85575 : 50008 hits, %0 failures -ReSign|src.c:85587 : 50008 hits, %0 failures -ReSign|src.c:85777 : 50008 hits, %0 failures -ReSign|src.c:86542 : 50008 hits, %0 failures -ReSign|src.c:85798 : 50008 hits, %0 failures -ReSign|src.c:86048 : 50008 hits, %0 failures -ReSign|src.c:86061 : 50006 hits, %0 failures -UnSign|src.c:64832 : 50002 hits, %0 failures -ReSign|src.c:64832 : 50002 hits, %0 failures -ReSign|src.c:66984 : 50002 hits, %0 failures -ReSign|src.c:66987 : 50002 hits, %0 failures -ReSign|src.c:66990 : 50002 hits, %0 failures -ReSign|src.c:67000 : 50002 hits, %0 failures -ReSign|src.c:67001 : 50002 hits, %0 failures -UnSign|src.c:64152 : 50000 hits, %0 failures -ReSign|src.c:64152 : 50000 hits, %0 failures -ReSign|src.c:64158 : 50000 hits, %50 failures -ReSign|src.c:57558 : 50000 hits, %0 failures -ReSign|src.c:82923 : 50000 hits, %0 failures -ReSign|src.c:82942 : 50000 hits, %0 failures -ReSign|src.c:82799 : 50000 hits, %0 failures -ReSign|src.c:82804 : 50000 hits, %0 failures -ReSign|src.c:67212 : 50000 hits, %0 failures -UnSign|src.c:67214 : 50000 hits, %0 failures -ReSign|src.c:67214 : 50000 hits, %0 failures -ReSign|src.c:67215 : 50000 hits, %0 failures -UnSign|src.c:67218 : 50000 hits, %0 failures -ReSign|src.c:67218 : 50000 hits, %0 failures -UnSign|src.c:60431 : 50000 hits, %0 failures -UnSign|src.c:60441 : 50000 hits, %0 failures -ReSign|src.c:60444 : 50000 hits, %0 failures -ReSign|src.c:48188 : 50000 hits, %0 failures -UnSign|src.c:60483 : 50000 hits, %0 failures -ReSign|src.c:60483 : 50000 hits, %0 failures -ReSign|dlmalloc.c:4782 : 49320 hits, %0 failures -UnSign|dlmalloc.c:4786 : 49320 hits, %0 failures -ReSign|src.c:53692 : 47066 hits, %0 failures -ReSign|src.c:53772 : 47066 hits, %0 failures -ReSign|src.c:53985 : 47066 hits, %0 failures -UnSign|src.c:51834 : 46608 hits, %0 failures -ReSign|src.c:51835 : 46608 hits, %0 failures -ReSign|dlmalloc.c:4217 : 46500 hits, %0 failures -ReSign|src.c:53547 : 45980 hits, %0 failures -ReSign|src.c:53982 : 45980 hits, %0 failures -ReSign|src.c:53578 : 45950 hits, %0 failures -ReSign|src.c:48807 : 45544 hits, %0 failures -UnSign|src.c:61387 : 45005 hits, %0 failures -ReSign|src.c:61387 : 45005 hits, %0 failures -UnSign|src.c:68074 : 45000 hits, %0 failures -UnSign|src.c:68096 : 45000 hits, %0 failures -ReSign|src.c:68096 : 45000 hits, %0 failures -ReSign|src.c:68103 : 45000 hits, %0 failures -ReSign|src.c:82812 : 45000 hits, %0 failures -ReSign|src.c:82813 : 45000 hits, %0 failures -ReSign|src.c:82814 : 45000 hits, %0 failures -UnSign|src.c:82814 : 45000 hits, %0 failures -ReSign|src.c:82815 : 45000 hits, %0 failures -UnSign|src.c:82815 : 45000 hits, %0 failures -ReSign|src.c:82825 : 45000 hits, %0 failures -ReSign|dlmalloc.c:4763 : 44824 hits, %0 failures -ReSign|dlmalloc.c:4231 : 42942 hits, %0 failures -ReSign|src.c:60718 : 40004 hits, %0 failures -UnSign|src.c:82829 : 40000 hits, %0 failures -UnSign|src.c:82833 : 40000 hits, %0 failures -ReSign|src.c:82869 : 40000 hits, %0 failures -ReSign|src.c:82870 : 40000 hits, %0 failures -UnSign|src.c:82870 : 40000 hits, %0 failures -ReSign|src.c:82871 : 40000 hits, %0 failures -UnSign|src.c:82871 : 40000 hits, %0 failures -UnSign|src.c:48846 : 38640 hits, %0 failures -ReSign|src.c:48846 : 38640 hits, %0 failures -UnSign|src.c:53745 : 37648 hits, %0 failures -UnSign|src.c:49031 : 37516 hits, %0 failures -UnSign|src.c:48807 : 35662 hits, %0 failures -ReSign|src.c:53694 : 35556 hits, %0 failures -ReSign|src.c:53741 : 35556 hits, %0 failures -ReSign|src.c:53787 : 35556 hits, %0 failures -UnSign|src.c:51810 : 35399 hits, %0 failures -ReSign|src.c:48525 : 35191 hits, %0 failures -UnSign|src.c:51609 : 35002 hits, %0 failures -ReSign|src.c:51609 : 35002 hits, %0 failures -UnSign|src.c:51583 : 35002 hits, %0 failures -UnSign|src.c:53458 : 34993 hits, %0 failures -UnSign|src.c:53467 : 34470 hits, %0 failures -UnSign|src.c:53559 : 34470 hits, %0 failures -UnSign|src.c:48720 : 33618 hits, %0 failures -ReSign|src.c:48721 : 33618 hits, %0 failures -ReSign|src.c:51808 : 30375 hits, %0 failures -ReSign|src.c:82797 : 30000 hits, %0 failures -UnSign|src.c:35525 : 29128 hits, %0 failures -UnSign|src.c:52093 : 26170 hits, %0 failures -UnSign|dlmalloc.c:4624 : 25226 hits, %0 failures -UnSign|dlmalloc.c:4626 : 25226 hits, %0 failures -ReSign|dlmalloc.c:4628 : 25226 hits, %0 failures -UnSign|dlmalloc.c:4687 : 25111 hits, %0 failures -ReSign|src.c:57818 : 25067 hits, %0 failures -ReSign|src.c:57833 : 25067 hits, %0 failures -UnSign|src.c:59750 : 25064 hits, %0 failures -ReSign|src.c:49970 : 25062 hits, %0 failures -ReSign|src.c:47763 : 25047 hits, %0 failures -ReSign|src.c:61484 : 25044 hits, %0 failures -UnSign|src.c:61484 : 25044 hits, %0 failures -ReSign|src.c:60853 : 25043 hits, %0 failures -ReSign|src.c:50070 : 25043 hits, %0 failures -UnSign|src.c:49970 : 25043 hits, %0 failures -ReSign|src.c:77316 : 25042 hits, %0 failures -UnSign|src.c:50070 : 25041 hits, %0 failures -ReSign|src.c:58131 : 25041 hits, %0 failures -ReSign|src.c:80842 : 25040 hits, %0 failures -ReSign|src.c:80844 : 25040 hits, %0 failures -ReSign|src.c:80849 : 25040 hits, %0 failures -ReSign|src.c:90057 : 25038 hits, %0 failures -ReSign|src.c:90060 : 25038 hits, %0 failures -ReSign|src.c:59100 : 25038 hits, %0 failures -ReSign|src.c:50994 : 25038 hits, %0 failures -ReSign|src.c:68358 : 25036 hits, %0 failures -UnSign|src.c:62570 : 25036 hits, %0 failures -ReSign|src.c:62570 : 25036 hits, %0 failures -UnSign|src.c:62573 : 25036 hits, %0 failures -ReSign|src.c:72237 : 25035 hits, %0 failures -UnSign|src.c:72241 : 25035 hits, %0 failures -UnSign|src.c:107273 : 25035 hits, %0 failures -UnSign|src.c:107279 : 25035 hits, %0 failures -ReSign|src.c:107286 : 25035 hits, %0 failures -ReSign|src.c:60861 : 25035 hits, %0 failures -ReSign|src.c:61295 : 25035 hits, %0 failures -ReSign|src.c:61159 : 25035 hits, %0 failures -ReSign|src.c:61189 : 25035 hits, %0 failures -ReSign|src.c:61199 : 25035 hits, %0 failures -ReSign|src.c:61221 : 25035 hits, %0 failures -ReSign|src.c:63348 : 25035 hits, %0 failures -ReSign|src.c:63358 : 25035 hits, %0 failures -ReSign|src.c:63361 : 25035 hits, %0 failures -UnSign|src.c:63361 : 25035 hits, %0 failures -ReSign|src.c:61241 : 25035 hits, %0 failures -ReSign|src.c:61250 : 25035 hits, %0 failures -UnSign|src.c:61265 : 25035 hits, %0 failures -ReSign|src.c:61265 : 25035 hits, %0 failures -ReSign|src.c:61300 : 25035 hits, %0 failures -ReSign|src.c:61306 : 25035 hits, %0 failures -ReSign|src.c:86988 : 25035 hits, %0 failures -UnSign|src.c:74947 : 25035 hits, %0 failures -ReSign|src.c:74947 : 25035 hits, %0 failures -ReSign|src.c:97494 : 25034 hits, %0 failures -ReSign|src.c:107439 : 25034 hits, %0 failures -ReSign|src.c:104686 : 25034 hits, %0 failures -ReSign|src.c:107447 : 25034 hits, %0 failures -ReSign|src.c:107457 : 25034 hits, %0 failures -ReSign|src.c:77490 : 25034 hits, %0 failures -ReSign|src.c:77491 : 25034 hits, %0 failures -ReSign|src.c:59068 : 25034 hits, %0 failures -ReSign|src.c:59095 : 25034 hits, %0 failures -ReSign|src.c:104839 : 25034 hits, %0 failures -ReSign|src.c:107512 : 25034 hits, %0 failures -ReSign|src.c:107519 : 25034 hits, %0 failures -UnSign|src.c:107530 : 25034 hits, %0 failures -ReSign|src.c:107530 : 25034 hits, %0 failures -ReSign|src.c:107540 : 25034 hits, %0 failures -ReSign|src.c:95614 : 25034 hits, %0 failures -ReSign|src.c:107549 : 25034 hits, %0 failures -ReSign|src.c:107552 : 25034 hits, %0 failures -ReSign|src.c:107557 : 25034 hits, %0 failures -ReSign|src.c:107562 : 25034 hits, %0 failures -ReSign|src.c:72228 : 25031 hits, %0 failures -ReSign|src.c:90322 : 25030 hits, %0 failures -ReSign|src.c:90166 : 25030 hits, %0 failures -ReSign|src.c:90203 : 25030 hits, %0 failures -ReSign|src.c:90216 : 25030 hits, %0 failures -ReSign|src.c:77492 : 25030 hits, %0 failures -ReSign|src.c:57605 : 25030 hits, %0 failures -ReSign|src.c:57607 : 25030 hits, %0 failures -ReSign|src.c:91878 : 25030 hits, %0 failures -ReSign|src.c:57680 : 25030 hits, %0 failures -ReSign|src.c:57682 : 25030 hits, %0 failures -UnSign|src.c:57683 : 25030 hits, %0 failures -ReSign|src.c:57686 : 25030 hits, %0 failures -ReSign|src.c:57713 : 25030 hits, %0 failures -ReSign|src.c:77500 : 25030 hits, %0 failures -ReSign|src.c:77509 : 25030 hits, %0 failures -ReSign|src.c:77561 : 25030 hits, %0 failures -UnSign|src.c:59069 : 25030 hits, %0 failures -ReSign|src.c:59069 : 25030 hits, %0 failures -ReSign|src.c:59103 : 25030 hits, %0 failures -ReSign|src.c:59110 : 25030 hits, %0 failures -ReSign|src.c:59112 : 25030 hits, %0 failures -ReSign|src.c:59115 : 25030 hits, %0 failures -ReSign|src.c:90239 : 25030 hits, %0 failures -ReSign|src.c:90242 : 25030 hits, %0 failures -ReSign|src.c:90243 : 25030 hits, %0 failures -ReSign|src.c:90246 : 25030 hits, %0 failures -ReSign|src.c:90249 : 25030 hits, %0 failures -UnSign|src.c:90255 : 25030 hits, %0 failures -UnSign|src.c:90278 : 25030 hits, %0 failures -ReSign|src.c:90278 : 25030 hits, %0 failures -UnSign|src.c:90282 : 25030 hits, %0 failures -ReSign|src.c:90289 : 25030 hits, %0 failures -ReSign|src.c:90297 : 25030 hits, %0 failures -ReSign|src.c:90328 : 25030 hits, %0 failures -ReSign|src.c:59698 : 25030 hits, %0 failures -ReSign|src.c:59840 : 25030 hits, %0 failures -ReSign|src.c:59849 : 25030 hits, %0 failures -ReSign|src.c:59857 : 25030 hits, %0 failures -ReSign|src.c:59862 : 25030 hits, %0 failures -ReSign|src.c:59900 : 25030 hits, %0 failures -ReSign|src.c:60022 : 25030 hits, %0 failures -ReSign|src.c:60024 : 25030 hits, %0 failures -ReSign|src.c:60030 : 25030 hits, %0 failures -ReSign|src.c:60000 : 25030 hits, %0 failures -UnSign|src.c:60001 : 25030 hits, %0 failures -ReSign|src.c:60002 : 25030 hits, %0 failures -ReSign|src.c:58214 : 25030 hits, %0 failures -UnSign|src.c:77872 : 25030 hits, %0 failures -ReSign|src.c:58536 : 25030 hits, %0 failures -ReSign|src.c:59132 : 25028 hits, %0 failures -ReSign|src.c:77664 : 25026 hits, %0 failures -ReSign|src.c:77669 : 25026 hits, %0 failures -ReSign|src.c:77424 : 25026 hits, %0 failures -ReSign|src.c:80858 : 25026 hits, %0 failures -ReSign|src.c:65866 : 25026 hits, %0 failures -UnSign|src.c:65880 : 25026 hits, %0 failures -ReSign|src.c:65880 : 25026 hits, %0 failures -ReSign|src.c:65889 : 25026 hits, %0 failures -ReSign|src.c:62492 : 25026 hits, %0 failures -ReSign|src.c:62498 : 25026 hits, %0 failures -ReSign|src.c:62502 : 25026 hits, %0 failures -ReSign|src.c:62507 : 25026 hits, %0 failures -ReSign|src.c:62510 : 25026 hits, %0 failures -ReSign|src.c:65915 : 25026 hits, %0 failures -ReSign|src.c:65926 : 25026 hits, %0 failures -UnSign|src.c:65935 : 25026 hits, %0 failures -ReSign|src.c:65936 : 25026 hits, %0 failures -UnSign|src.c:65936 : 25026 hits, %0 failures -ReSign|src.c:59135 : 25026 hits, %0 failures -ReSign|src.c:59139 : 25026 hits, %0 failures -ReSign|src.c:59143 : 25026 hits, %0 failures -ReSign|src.c:71652 : 25025 hits, %0 failures -UnSign|src.c:63694 : 25025 hits, %0 failures -ReSign|src.c:63694 : 25025 hits, %0 failures -ReSign|src.c:80538 : 25024 hits, %0 failures -ReSign|src.c:80540 : 25024 hits, %0 failures -ReSign|src.c:80543 : 25024 hits, %0 failures -ReSign|src.c:80544 : 25024 hits, %0 failures -ReSign|src.c:80548 : 25024 hits, %0 failures -ReSign|src.c:80552 : 25024 hits, %0 failures -ReSign|src.c:80586 : 25024 hits, %0 failures -ReSign|src.c:51007 : 25024 hits, %0 failures -ReSign|src.c:51751 : 25024 hits, %0 failures -ReSign|src.c:51089 : 25024 hits, %0 failures -ReSign|src.c:51094 : 25024 hits, %0 failures -ReSign|src.c:51099 : 25024 hits, %0 failures -ReSign|src.c:86924 : 25022 hits, %0 failures -ReSign|src.c:86925 : 25022 hits, %0 failures -ReSign|src.c:90014 : 25022 hits, %0 failures -UnSign|src.c:90014 : 25022 hits, %0 failures -ReSign|src.c:77441 : 25022 hits, %0 failures -UnSign|src.c:77467 : 25022 hits, %0 failures -ReSign|src.c:86936 : 25022 hits, %0 failures -ReSign|src.c:86939 : 25022 hits, %0 failures -UnSign|src.c:61194 : 25022 hits, %0 failures -ReSign|src.c:61204 : 25022 hits, %0 failures -ReSign|src.c:61211 : 25022 hits, %0 failures -UnSign|src.c:61217 : 25022 hits, %0 failures -ReSign|src.c:61217 : 25022 hits, %0 failures -ReSign|src.c:68793 : 25022 hits, %0 failures -UnSign|src.c:68358 : 25022 hits, %0 failures -ReSign|src.c:55592 : 25022 hits, %0 failures -ReSign|src.c:68364 : 25022 hits, %0 failures -UnSign|src.c:59709 : 25022 hits, %0 failures -ReSign|src.c:59711 : 25022 hits, %0 failures -ReSign|src.c:59740 : 25022 hits, %0 failures -ReSign|src.c:59802 : 25022 hits, %0 failures -ReSign|src.c:59820 : 25022 hits, %0 failures -ReSign|src.c:59830 : 25022 hits, %0 failures -ReSign|src.c:59842 : 25022 hits, %0 failures -ReSign|src.c:46509 : 25022 hits, %0 failures -ReSign|src.c:61244 : 25022 hits, %0 failures -ReSign|src.c:59901 : 25022 hits, %0 failures -ReSign|src.c:59908 : 25022 hits, %0 failures -ReSign|src.c:59913 : 25022 hits, %0 failures -ReSign|src.c:86991 : 25022 hits, %0 failures -ReSign|src.c:86994 : 25022 hits, %0 failures -ReSign|src.c:87005 : 25022 hits, %0 failures -ReSign|src.c:87009 : 25022 hits, %0 failures -ReSign|src.c:87018 : 25022 hits, %0 failures -UnSign|src.c:90032 : 25022 hits, %0 failures -UnSign|src.c:57816 : 25020 hits, %0 failures -ReSign|src.c:80846 : 25020 hits, %0 failures -ReSign|src.c:80861 : 25020 hits, %0 failures -ReSign|src.c:77516 : 25020 hits, %0 failures -UnSign|src.c:77516 : 25020 hits, %0 failures -UnSign|src.c:77517 : 25020 hits, %0 failures -ReSign|src.c:77517 : 25020 hits, %0 failures -ReSign|src.c:85272 : 25020 hits, %0 failures -ReSign|src.c:65636 : 25020 hits, %0 failures -ReSign|src.c:65638 : 25020 hits, %0 failures -ReSign|src.c:65643 : 25020 hits, %0 failures -ReSign|src.c:63628 : 25020 hits, %0 failures -ReSign|src.c:63633 : 25020 hits, %0 failures -ReSign|src.c:63639 : 25020 hits, %0 failures -ReSign|src.c:63644 : 25020 hits, %0 failures -UnSign|src.c:60377 : 25019 hits, %0 failures -ReSign|src.c:60381 : 25019 hits, %0 failures -ReSign|src.c:56536 : 25019 hits, %0 failures -UnSign|src.c:56541 : 25019 hits, %0 failures -UnSign|src.c:85063 : 25018 hits, %0 failures -ReSign|src.c:85063 : 25018 hits, %0 failures -ReSign|src.c:85066 : 25018 hits, %0 failures -UnSign|src.c:60274 : 25018 hits, %0 failures -UnSign|src.c:60280 : 25018 hits, %0 failures -ReSign|src.c:60280 : 25018 hits, %0 failures -ReSign|src.c:59587 : 25018 hits, %0 failures -ReSign|src.c:57622 : 25016 hits, %0 failures -ReSign|src.c:81638 : 25014 hits, %0 failures -ReSign|src.c:65772 : 25014 hits, %0 failures -ReSign|src.c:80897 : 25010 hits, %0 failures -UnSign|src.c:80900 : 25010 hits, %0 failures -UnSign|src.c:81638 : 25010 hits, %0 failures -UnSign|src.c:50991 : 25010 hits, %0 failures -ReSign|src.c:64600 : 25009 hits, %0 failures -UnSign|src.c:64600 : 25009 hits, %0 failures -ReSign|src.c:81612 : 25008 hits, %0 failures -ReSign|src.c:81615 : 25008 hits, %0 failures -UnSign|src.c:66755 : 25008 hits, %0 failures -ReSign|src.c:66755 : 25008 hits, %0 failures -UnSign|src.c:66766 : 25008 hits, %0 failures -ReSign|src.c:66766 : 25008 hits, %0 failures -UnSign|src.c:66767 : 25008 hits, %0 failures -ReSign|src.c:66767 : 25008 hits, %0 failures -UnSign|src.c:66768 : 25008 hits, %0 failures -ReSign|src.c:66768 : 25008 hits, %0 failures -UnSign|src.c:66774 : 25008 hits, %0 failures -ReSign|src.c:66774 : 25008 hits, %0 failures -UnSign|src.c:66775 : 25008 hits, %0 failures -ReSign|src.c:66775 : 25008 hits, %0 failures -UnSign|src.c:66781 : 25008 hits, %0 failures -UnSign|src.c:48001 : 25008 hits, %0 failures -ReSign|src.c:48001 : 25008 hits, %0 failures -UnSign|src.c:56686 : 25008 hits, %0 failures -ReSign|src.c:56686 : 25008 hits, %0 failures -UnSign|src.c:56690 : 25008 hits, %0 failures -UnSign|src.c:56694 : 25008 hits, %0 failures -ReSign|src.c:56694 : 25008 hits, %0 failures -UnSign|src.c:56696 : 25008 hits, %0 failures -ReSign|src.c:56696 : 25008 hits, %0 failures -ReSign|src.c:95796 : 25006 hits, %0 failures -ReSign|src.c:95206 : 25006 hits, %0 failures -ReSign|src.c:95213 : 25006 hits, %0 failures -ReSign|src.c:95224 : 25006 hits, %0 failures -ReSign|src.c:95800 : 25006 hits, %0 failures -ReSign|src.c:95805 : 25006 hits, %0 failures -ReSign|src.c:95808 : 25006 hits, %0 failures -UnSign|src.c:97840 : 25006 hits, %0 failures -ReSign|src.c:97840 : 25006 hits, %0 failures -ReSign|src.c:79111 : 25006 hits, %0 failures -UnSign|src.c:79114 : 25006 hits, %0 failures -ReSign|src.c:79114 : 25006 hits, %0 failures -ReSign|src.c:79121 : 25006 hits, %0 failures -UnSign|src.c:81637 : 25006 hits, %0 failures -ReSign|src.c:81637 : 25006 hits, %0 failures -ReSign|src.c:86195 : 25006 hits, %0 failures -ReSign|src.c:86251 : 25006 hits, %0 failures -ReSign|src.c:86270 : 25006 hits, %0 failures -ReSign|src.c:86349 : 25006 hits, %0 failures -ReSign|src.c:86445 : 25006 hits, %0 failures -ReSign|src.c:86480 : 25006 hits, %0 failures -ReSign|src.c:86481 : 25006 hits, %0 failures -ReSign|src.c:85142 : 25006 hits, %0 failures -ReSign|src.c:86493 : 25006 hits, %0 failures -ReSign|src.c:86499 : 25006 hits, %0 failures -ReSign|src.c:86502 : 25006 hits, %0 failures -ReSign|src.c:86506 : 25006 hits, %0 failures -UnSign|src.c:65647 : 25006 hits, %0 failures -ReSign|src.c:66565 : 25006 hits, %0 failures -ReSign|src.c:66593 : 25006 hits, %0 failures -ReSign|src.c:66595 : 25006 hits, %0 failures -UnSign|src.c:51880 : 25006 hits, %0 failures -ReSign|src.c:51880 : 25006 hits, %0 failures -ReSign|src.c:51895 : 25006 hits, %0 failures -UnSign|src.c:51896 : 25006 hits, %0 failures -ReSign|src.c:51896 : 25006 hits, %0 failures -ReSign|src.c:66597 : 25006 hits, %0 failures -ReSign|src.c:66600 : 25006 hits, %0 failures -ReSign|src.c:66615 : 25006 hits, %0 failures -ReSign|src.c:66645 : 25006 hits, %0 failures -ReSign|src.c:66647 : 25006 hits, %0 failures -ReSign|src.c:59783 : 25005 hits, %0 failures -ReSign|src.c:59784 : 25005 hits, %0 failures -ReSign|src.c:59804 : 25005 hits, %0 failures -UnSign|src.c:56985 : 25005 hits, %0 failures -ReSign|src.c:56985 : 25005 hits, %0 failures -UnSign|src.c:105905 : 25004 hits, %0 failures -UnSign|src.c:85516 : 25004 hits, %0 failures -ReSign|src.c:85524 : 25004 hits, %0 failures -ReSign|src.c:85526 : 25004 hits, %0 failures -ReSign|src.c:85533 : 25004 hits, %0 failures -ReSign|src.c:85542 : 25004 hits, %0 failures -UnSign|src.c:85542 : 25004 hits, %0 failures -ReSign|src.c:85558 : 25004 hits, %0 failures -ReSign|src.c:85566 : 25004 hits, %0 failures -ReSign|src.c:85573 : 25004 hits, %0 failures -UnSign|src.c:85574 : 25004 hits, %0 failures -ReSign|src.c:85574 : 25004 hits, %0 failures -UnSign|src.c:85575 : 25004 hits, %0 failures -ReSign|src.c:86665 : 25004 hits, %0 failures -UnSign|src.c:85232 : 25004 hits, %0 failures -ReSign|src.c:85232 : 25004 hits, %0 failures -ReSign|src.c:85604 : 25004 hits, %0 failures -ReSign|src.c:85708 : 25004 hits, %0 failures -UnSign|src.c:85719 : 25004 hits, %0 failures -ReSign|src.c:85719 : 25004 hits, %0 failures -ReSign|src.c:85730 : 25004 hits, %0 failures -ReSign|src.c:85746 : 25004 hits, %0 failures -ReSign|src.c:85783 : 25004 hits, %0 failures -ReSign|src.c:85789 : 25004 hits, %0 failures -UnSign|src.c:86530 : 25004 hits, %0 failures -ReSign|src.c:86530 : 25004 hits, %0 failures -ReSign|src.c:86535 : 25004 hits, %0 failures -ReSign|src.c:85795 : 25004 hits, %0 failures -ReSign|src.c:85804 : 25004 hits, %0 failures -ReSign|src.c:85816 : 25004 hits, %0 failures -UnSign|src.c:85835 : 25004 hits, %0 failures -ReSign|src.c:85835 : 25004 hits, %0 failures -ReSign|src.c:85844 : 25004 hits, %0 failures -ReSign|src.c:85916 : 25004 hits, %0 failures -UnSign|src.c:85917 : 25004 hits, %0 failures -ReSign|src.c:85917 : 25004 hits, %0 failures -ReSign|src.c:85921 : 25004 hits, %0 failures -UnSign|src.c:85953 : 25004 hits, %0 failures -ReSign|src.c:85953 : 25004 hits, %0 failures -ReSign|src.c:85301 : 25004 hits, %0 failures -UnSign|src.c:86003 : 25004 hits, %0 failures -ReSign|src.c:86003 : 25004 hits, %0 failures -ReSign|src.c:86013 : 25004 hits, %0 failures -UnSign|src.c:86013 : 25004 hits, %0 failures -UnSign|src.c:84537 : 25004 hits, %0 failures -ReSign|src.c:84543 : 25004 hits, %0 failures -ReSign|src.c:86017 : 25004 hits, %0 failures -UnSign|src.c:86017 : 25004 hits, %0 failures -UnSign|src.c:86500 : 25004 hits, %0 failures -UnSign|src.c:86503 : 25004 hits, %0 failures -ReSign|src.c:86025 : 25004 hits, %0 failures -ReSign|src.c:86029 : 25004 hits, %0 failures -ReSign|src.c:86039 : 25004 hits, %0 failures -ReSign|src.c:86043 : 25004 hits, %0 failures -UnSign|src.c:86048 : 25004 hits, %0 failures -ReSign|src.c:86051 : 25004 hits, %0 failures -UnSign|src.c:86061 : 25004 hits, %0 failures -ReSign|src.c:86070 : 25004 hits, %0 failures -UnSign|src.c:64824 : 25002 hits, %0 failures -ReSign|src.c:64824 : 25002 hits, %0 failures -UnSign|src.c:56796 : 25002 hits, %0 failures -ReSign|src.c:56796 : 25002 hits, %0 failures -UnSign|src.c:56798 : 25002 hits, %0 failures -ReSign|src.c:56798 : 25002 hits, %0 failures -ReSign|src.c:56799 : 25002 hits, %0 failures -UnSign|src.c:64830 : 25002 hits, %0 failures -ReSign|src.c:64834 : 25002 hits, %0 failures -ReSign|src.c:86497 : 25002 hits, %0 failures -UnSign|src.c:86497 : 25002 hits, %0 failures -ReSign|src.c:85319 : 25002 hits, %0 failures -ReSign|src.c:59821 : 25002 hits, %0 failures -ReSign|src.c:51838 : 25002 hits, %0 failures -UnSign|src.c:51839 : 25002 hits, %0 failures -ReSign|src.c:51839 : 25002 hits, %0 failures -ReSign|src.c:51903 : 25002 hits, %0 failures -ReSign|src.c:66606 : 25002 hits, %0 failures -UnSign|src.c:51960 : 25002 hits, %0 failures -ReSign|src.c:64602 : 25000 hits, %0 failures -UnSign|src.c:64602 : 25000 hits, %0 failures -UnSign|src.c:64139 : 25000 hits, %0 failures -UnSign|src.c:64176 : 25000 hits, %0 failures -UnSign|src.c:64179 : 25000 hits, %0 failures -ReSign|src.c:64179 : 25000 hits, %0 failures -UnSign|src.c:57558 : 25000 hits, %0 failures -UnSign|src.c:57559 : 25000 hits, %0 failures -ReSign|src.c:57559 : 25000 hits, %0 failures -ReSign|src.c:82929 : 25000 hits, %0 failures -UnSign|src.c:82804 : 25000 hits, %0 failures -ReSign|src.c:64192 : 25000 hits, %0 failures -ReSign|src.c:64198 : 25000 hits, %0 failures -ReSign|src.c:64209 : 25000 hits, %0 failures -UnSign|src.c:64215 : 25000 hits, %0 failures -ReSign|src.c:64217 : 25000 hits, %0 failures -ReSign|src.c:82826 : 25000 hits, %0 failures -ReSign|src.c:53750 : 24046 hits, %0 failures -UnSign|src.c:53794 : 24046 hits, %0 failures -ReSign|src.c:53470 : 23130 hits, %0 failures -UnSign|src.c:18409 : 23020 hits, %0 failures -UnSign|src.c:52934 : 22964 hits, %0 failures -ReSign|src.c:48813 : 22964 hits, %0 failures -UnSign|src.c:48820 : 22964 hits, %0 failures -UnSign|src.c:52947 : 22964 hits, %0 failures -UnSign|src.c:53590 : 22960 hits, %0 failures -ReSign|src.c:54097 : 21546 hits, %0 failures -ReSign|src.c:67341 : 20002 hits, %0 failures -ReSign|src.c:67347 : 20002 hits, %0 failures -ReSign|src.c:57323 : 20002 hits, %0 failures -UnSign|src.c:57330 : 20002 hits, %0 failures -ReSign|src.c:60724 : 20002 hits, %0 failures -UnSign|src.c:67357 : 20002 hits, %0 failures -ReSign|src.c:67357 : 20002 hits, %0 failures -ReSign|src.c:67363 : 20002 hits, %0 failures -ReSign|src.c:64604 : 20000 hits, %0 failures -UnSign|src.c:64604 : 20000 hits, %0 failures -UnSign|src.c:48876 : 18764 hits, %0 failures -ReSign|src.c:48878 : 18764 hits, %0 failures -ReSign|src.c:49024 : 18758 hits, %0 failures -UnSign|src.c:49027 : 18758 hits, %0 failures -UnSign|src.c:49028 : 18758 hits, %0 failures -ReSign|src.c:49028 : 18758 hits, %0 failures -UnSign|src.c:49029 : 18758 hits, %0 failures -UnSign|src.c:49030 : 18758 hits, %0 failures -UnSign|src.c:49032 : 18758 hits, %0 failures -UnSign|src.c:53086 : 18746 hits, %0 failures -UnSign|src.c:53099 : 18746 hits, %0 failures -UnSign|src.c:53110 : 18746 hits, %0 failures -ReSign|src.c:53651 : 17778 hits, %0 failures -ReSign|src.c:48883 : 17654 hits, %0 failures -ReSign|src.c:53463 : 17235 hits, %0 failures -ReSign|src.c:53468 : 17235 hits, %0 failures -UnSign|src.c:53560 : 17235 hits, %0 failures -ReSign|src.c:53560 : 17235 hits, %0 failures -ReSign|src.c:53699 : 17235 hits, %0 failures -UnSign|src.c:54097 : 16605 hits, %0 failures -ReSign|src.c:48515 : 15866 hits, %0 failures -ReSign|src.c:52180 : 15336 hits, %0 failures -UnSign|src.c:64846 : 15000 hits, %0 failures -ReSign|src.c:64846 : 15000 hits, %0 failures -ReSign|src.c:35492 : 14564 hits, %0 failures -ReSign|src.c:54076 : 13384 hits, %0 failures -ReSign|src.c:54079 : 13384 hits, %0 failures -ReSign|src.c:48808 : 12698 hits, %0 failures -ReSign|src.c:54106 : 12531 hits, %0 failures -UnSign|src.c:53629 : 12023 hits, %0 failures -ReSign|src.c:53631 : 12023 hits, %0 failures -ReSign|src.c:53634 : 12023 hits, %0 failures -ReSign|src.c:53796 : 12023 hits, %0 failures -ReSign|src.c:53832 : 12023 hits, %0 failures -ReSign|src.c:53798 : 11891 hits, %0 failures -UnSign|src.c:53823 : 11891 hits, %0 failures -ReSign|src.c:53823 : 11891 hits, %0 failures -UnSign|src.c:53470 : 11650 hits, %0 failures -UnSign|src.c:53440 : 11510 hits, %0 failures -UnSign|src.c:53455 : 11510 hits, %0 failures -ReSign|src.c:53455 : 11510 hits, %0 failures -ReSign|src.c:53719 : 11510 hits, %0 failures -ReSign|src.c:52926 : 11482 hits, %0 failures -UnSign|src.c:52933 : 11482 hits, %0 failures -UnSign|src.c:52935 : 11482 hits, %0 failures -ReSign|src.c:48788 : 11482 hits, %0 failures -UnSign|src.c:48803 : 11482 hits, %0 failures -ReSign|src.c:52943 : 11482 hits, %0 failures -UnSign|src.c:52959 : 11482 hits, %0 failures -UnSign|src.c:52960 : 11482 hits, %0 failures -UnSign|src.c:53478 : 11480 hits, %0 failures -ReSign|src.c:53492 : 11480 hits, %0 failures -UnSign|src.c:53503 : 11480 hits, %0 failures -UnSign|src.c:53584 : 11480 hits, %0 failures -UnSign|src.c:53587 : 11480 hits, %0 failures -UnSign|src.c:53588 : 11480 hits, %0 failures -ReSign|src.c:53591 : 11480 hits, %0 failures -ReSign|src.c:53448 : 11406 hits, %0 failures -UnSign|src.c:53599 : 11363 hits, %0 failures -ReSign|src.c:53599 : 11363 hits, %0 failures -UnSign|src.c:54106 : 10595 hits, %0 failures -ReSign|src.c:52173 : 10244 hits, %0 failures -UnSign|src.c:52180 : 10224 hits, %0 failures -UnSign|dlmalloc.c:4761 : 10192 hits, %0 failures -ReSign|dlmalloc.c:4762 : 10192 hits, %0 failures -ReSign|src.c:51810 : 10114 hits, %0 failures -ReSign|src.c:48629 : 9520 hits, %0 failures -ReSign|src.c:48641 : 9520 hits, %0 failures -ReSign|src.c:48832 : 9363 hits, %0 failures -ReSign|src.c:48725 : 9325 hits, %0 failures -UnSign|src.c:35773 : 9224 hits, %0 failures -UnSign|src.c:48850 : 7968 hits, %0 failures -ReSign|src.c:34814 : 7645 hits, %0 failures -ReSign|src.c:53847 : 7344 hits, %0 failures -ReSign|src.c:35524 : 7284 hits, %0 failures -ReSign|src.c:35504 : 7282 hits, %0 failures -ReSign|src.c:35509 : 7282 hits, %0 failures -UnSign|src.c:53214 : 6776 hits, %0 failures -ReSign|src.c:54170 : 6729 hits, %0 failures -ReSign|src.c:53013 : 6723 hits, %0 failures -ReSign|src.c:53017 : 6723 hits, %0 failures -UnSign|src.c:53020 : 6723 hits, %0 failures -UnSign|src.c:54101 : 6723 hits, %0 failures -ReSign|src.c:54104 : 6723 hits, %0 failures -UnSign|src.c:54068 : 6655 hits, %0 failures -ReSign|src.c:54172 : 6655 hits, %0 failures -ReSign|src.c:54330 : 6655 hits, %0 failures -UnSign|src.c:48835 : 6242 hits, %0 failures -UnSign|src.c:48836 : 6242 hits, %0 failures -UnSign|src.c:48838 : 6242 hits, %0 failures -ReSign|src.c:35776 : 6133 hits, %0 failures -ReSign|src.c:48730 : 6124 hits, %0 failures -ReSign|src.c:41824 : 6092 hits, %0 failures -ReSign|src.c:51698 : 6090 hits, %0 failures -UnSign|src.c:34416 : 5847 hits, %0 failures -ReSign|src.c:54148 : 5755 hits, %0 failures -UnSign|src.c:54148 : 5755 hits, %0 failures -ReSign|src.c:53425 : 5755 hits, %0 failures -ReSign|src.c:53441 : 5755 hits, %0 failures -ReSign|src.c:18364 : 5755 hits, %0 failures -ReSign|src.c:18372 : 5755 hits, %0 failures -ReSign|src.c:18375 : 5755 hits, %0 failures -ReSign|src.c:53521 : 5755 hits, %0 failures -UnSign|src.c:53545 : 5755 hits, %0 failures -UnSign|src.c:53546 : 5755 hits, %0 failures -UnSign|src.c:53624 : 5755 hits, %0 failures -UnSign|src.c:53687 : 5755 hits, %0 failures -UnSign|src.c:53691 : 5755 hits, %0 failures -ReSign|src.c:53842 : 5755 hits, %0 failures -ReSign|src.c:53868 : 5755 hits, %0 failures -ReSign|src.c:18398 : 5755 hits, %0 failures -ReSign|src.c:18425 : 5755 hits, %0 failures -ReSign|src.c:54149 : 5755 hits, %0 failures -ReSign|src.c:53446 : 5730 hits, %0 failures -UnSign|dlmalloc.c:4763 : 5429 hits, %0 failures -ReSign|src.c:52165 : 5123 hits, %0 failures -ReSign|src.c:52179 : 5112 hits, %0 failures -ReSign|dlmalloc.c:4751 : 5096 hits, %0 failures -ReSign|src.c:52182 : 5058 hits, %0 failures -UnSign|src.c:60604 : 5005 hits, %0 failures -ReSign|src.c:60604 : 5005 hits, %0 failures -ReSign|src.c:128523 : 5001 hits, %0 failures -ReSign|src.c:128524 : 5000 hits, %0 failures -ReSign|src.c:128525 : 5000 hits, %0 failures -ReSign|src.c:128526 : 5000 hits, %0 failures -ReSign|src.c:128527 : 5000 hits, %0 failures -ReSign|src.c:128528 : 5000 hits, %0 failures -UnSign|src.c:53218 : 4892 hits, %0 failures -UnSign|src.c:54944 : 4840 hits, %0 failures -ReSign|src.c:48619 : 4828 hits, %0 failures -UnSign|src.c:48622 : 4760 hits, %0 failures -UnSign|src.c:48848 : 3984 hits, %0 failures -ReSign|src.c:54931 : 3912 hits, %0 failures -UnSign|src.c:35670 : 3594 hits, %0 failures -ReSign|src.c:35673 : 3584 hits, %0 failures -UnSign|src.c:35674 : 3584 hits, %0 failures -UnSign|src.c:20755 : 3429 hits, %0 failures -UnSign|src.c:48832 : 3121 hits, %0 failures -ReSign|src.c:35050 : 3058 hits, %0 failures -ReSign|src.c:38501 : 3054 hits, %0 failures -UnSign|src.c:35777 : 3050 hits, %0 failures -UnSign|src.c:36007 : 3046 hits, %0 failures -UnSign|src.c:36042 : 3046 hits, %0 failures -UnSign|src.c:41830 : 3046 hits, %0 failures -UnSign|src.c:52299 : 3042 hits, %0 failures -UnSign|src.c:52494 : 3042 hits, %0 failures -ReSign|src.c:52494 : 3042 hits, %0 failures -UnSign|src.c:41842 : 3042 hits, %0 failures -UnSign|src.c:48516 : 2910 hits, %0 failures -UnSign|src.c:48634 : 2380 hits, %0 failures -ReSign|src.c:53218 : 2276 hits, %0 failures -ReSign|src.c:20755 : 2101 hits, %0 failures -ReSign|src.c:54925 : 1960 hits, %0 failures -ReSign|src.c:54941 : 1956 hits, %0 failures -UnSign|src.c:54931 : 1956 hits, %0 failures -ReSign|src.c:34405 : 1949 hits, %0 failures -ReSign|src.c:34407 : 1949 hits, %0 failures -UnSign|src.c:34415 : 1949 hits, %0 failures -ReSign|src.c:34416 : 1949 hits, %0 failures -ReSign|src.c:19061 : 1894 hits, %0 failures -ReSign|src.c:54080 : 1720 hits, %0 failures -UnSign|dlmalloc.c:2557 : 1700 hits, %0 failures -ReSign|dlmalloc.c:4026 : 1700 hits, %0 failures -UnSign|dlmalloc.c:4026 : 1700 hits, %0 failures -UnSign|src.c:53847 : 1589 hits, %0 failures -ReSign|src.c:35061 : 1536 hits, %0 failures -UnSign|src.c:35037 : 1529 hits, %0 failures -UnSign|src.c:35047 : 1529 hits, %0 failures -ReSign|src.c:35047 : 1529 hits, %0 failures -UnSign|src.c:35049 : 1529 hits, %0 failures -ReSign|src.c:14658 : 1528 hits, %0 failures -ReSign|src.c:14664 : 1528 hits, %0 failures -ReSign|src.c:35999 : 1523 hits, %0 failures -ReSign|src.c:36012 : 1523 hits, %0 failures -ReSign|src.c:36033 : 1523 hits, %0 failures -ReSign|src.c:36034 : 1523 hits, %0 failures -ReSign|src.c:35573 : 1523 hits, %0 failures -ReSign|src.c:35575 : 1523 hits, %0 failures -ReSign|src.c:36038 : 1523 hits, %0 failures -ReSign|src.c:36041 : 1523 hits, %0 failures -UnSign|src.c:41824 : 1523 hits, %0 failures -UnSign|src.c:41829 : 1523 hits, %0 failures -ReSign|src.c:41829 : 1523 hits, %0 failures -ReSign|src.c:41834 : 1523 hits, %0 failures -ReSign|src.c:35592 : 1523 hits, %0 failures -ReSign|src.c:35594 : 1523 hits, %0 failures -UnSign|src.c:52302 : 1521 hits, %0 failures -ReSign|src.c:52492 : 1521 hits, %0 failures -UnSign|src.c:52497 : 1521 hits, %0 failures -ReSign|src.c:52497 : 1521 hits, %0 failures -ReSign|src.c:52520 : 1521 hits, %0 failures -ReSign|src.c:52522 : 1521 hits, %0 failures -ReSign|src.c:52533 : 1521 hits, %0 failures -ReSign|src.c:35233 : 1521 hits, %0 failures -ReSign|src.c:52534 : 1521 hits, %0 failures -UnSign|src.c:20361 : 1350 hits, %0 failures -ReSign|dlmalloc.c:4024 : 1275 hits, %0 failures -ReSign|src.c:57124 : 1256 hits, %0 failures -UnSign|src.c:20756 : 1140 hits, %0 failures -ReSign|src.c:108432 : 1002 hits, %0 failures -ReSign|src.c:54909 : 990 hits, %0 failures -ReSign|src.c:54900 : 980 hits, %0 failures -ReSign|src.c:54908 : 980 hits, %0 failures -UnSign|src.c:54909 : 980 hits, %0 failures -ReSign|src.c:54923 : 980 hits, %0 failures -ReSign|src.c:54940 : 978 hits, %0 failures -UnSign|src.c:54940 : 978 hits, %0 failures -UnSign|src.c:54941 : 978 hits, %0 failures -ReSign|src.c:48516 : 970 hits, %0 failures -UnSign|src.c:54910 : 970 hits, %0 failures -UnSign|src.c:53165 : 968 hits, %0 failures -ReSign|src.c:53165 : 968 hits, %0 failures -ReSign|src.c:53173 : 968 hits, %0 failures -ReSign|src.c:53194 : 968 hits, %0 failures -UnSign|src.c:53216 : 968 hits, %0 failures -ReSign|src.c:53216 : 968 hits, %0 failures -UnSign|src.c:53221 : 968 hits, %0 failures -UnSign|src.c:53225 : 968 hits, %0 failures -ReSign|src.c:54933 : 968 hits, %0 failures -ReSign|src.c:54934 : 968 hits, %0 failures -ReSign|src.c:19452 : 920 hits, %0 failures -ReSign|src.c:19470 : 920 hits, %0 failures -UnSign|dlmalloc.c:3876 : 852 hits, %0 failures -UnSign|dlmalloc.c:3996 : 852 hits, %0 failures -UnSign|dlmalloc.c:4052 : 852 hits, %0 failures -ReSign|dlmalloc.c:3930 : 850 hits, %0 failures -ReSign|src.c:19451 : 768 hits, %0 failures -UnSign|src.c:53456 : 756 hits, %0 failures -ReSign|src.c:19136 : 645 hits, %0 failures -ReSign|src.c:73426 : 627 hits, %0 failures -ReSign|src.c:73427 : 570 hits, %0 failures -ReSign|src.c:53703 : 543 hits, %0 failures -ReSign|src.c:53708 : 543 hits, %0 failures -ReSign|src.c:19468 : 512 hits, %0 failures -UnSign|src.c:19903 : 512 hits, %0 failures -ReSign|src.c:74966 : 460 hits, %0 failures -ReSign|src.c:20361 : 450 hits, %0 failures -UnSign|src.c:20362 : 444 hits, %0 failures -ReSign|src.c:20362 : 444 hits, %0 failures -ReSign|src.c:19435 : 432 hits, %0 failures -ReSign|dlmalloc.c:3873 : 427 hits, %0 failures -ReSign|dlmalloc.c:3876 : 426 hits, %0 failures -ReSign|dlmalloc.c:3904 : 426 hits, %0 failures -ReSign|dlmalloc.c:3906 : 426 hits, %0 failures -ReSign|dlmalloc.c:3910 : 426 hits, %0 failures -ReSign|dlmalloc.c:3936 : 426 hits, %0 failures -ReSign|dlmalloc.c:3963 : 426 hits, %0 failures -ReSign|dlmalloc.c:3975 : 426 hits, %0 failures -ReSign|dlmalloc.c:3994 : 426 hits, %0 failures -ReSign|dlmalloc.c:3999 : 426 hits, %0 failures -ReSign|dlmalloc.c:3729 : 426 hits, %0 failures -UnSign|dlmalloc.c:3929 : 425 hits, %0 failures -ReSign|src.c:73407 : 397 hits, %0 failures -UnSign|src.c:20763 : 396 hits, %0 failures -ReSign|src.c:73406 : 331 hits, %0 failures -ReSign|src.c:98930 : 304 hits, %0 failures -ReSign|src.c:70225 : 290 hits, %0 failures -UnSign|src.c:19539 : 274 hits, %0 failures -ReSign|src.c:19547 : 274 hits, %0 failures -ReSign|src.c:19550 : 274 hits, %0 failures -ReSign|src.c:19899 : 257 hits, %0 failures -ReSign|src.c:19902 : 257 hits, %0 failures -ReSign|src.c:19903 : 256 hits, %0 failures -UnSign|src.c:19904 : 256 hits, %0 failures -UnSign|src.c:19905 : 256 hits, %0 failures -ReSign|src.c:70196 : 252 hits, %0 failures -ReSign|src.c:74965 : 252 hits, %0 failures -ReSign|src.c:98754 : 240 hits, %0 failures -ReSign|src.c:98755 : 240 hits, %0 failures -ReSign|src.c:19135 : 215 hits, %0 failures -UnSign|src.c:78319 : 208 hits, %0 failures -ReSign|src.c:19056 : 208 hits, %0 failures -ReSign|src.c:78388 : 200 hits, %0 failures -ReSign|dlmalloc.c:4278 : 190 hits, %0 failures -ReSign|src.c:81358 : 187 hits, %0 failures -ReSign|src.c:72361 : 178 hits, %0 failures -ReSign|src.c:81387 : 175 hits, %0 failures -ReSign|src.c:78318 : 168 hits, %0 failures -ReSign|src.c:70191 : 168 hits, %0 failures -ReSign|src.c:81388 : 162 hits, %0 failures -ReSign|src.c:59320 : 153 hits, %0 failures -ReSign|src.c:59352 : 153 hits, %0 failures -ReSign|src.c:59364 : 153 hits, %0 failures -ReSign|src.c:78389 : 148 hits, %0 failures -UnSign|src.c:78389 : 148 hits, %0 failures -ReSign|src.c:78391 : 148 hits, %0 failures -ReSign|src.c:78393 : 144 hits, %0 failures -ReSign|src.c:78395 : 144 hits, %0 failures -ReSign|src.c:19065 : 142 hits, %0 failures -ReSign|src.c:19094 : 138 hits, %0 failures -ReSign|src.c:19539 : 137 hits, %0 failures -ReSign|src.c:19544 : 137 hits, %0 failures -ReSign|src.c:70226 : 137 hits, %0 failures -ReSign|src.c:98793 : 135 hits, %0 failures -UnSign|src.c:81405 : 130 hits, %0 failures -ReSign|src.c:78397 : 128 hits, %0 failures -ReSign|src.c:78401 : 128 hits, %0 failures -ReSign|src.c:78404 : 128 hits, %0 failures -ReSign|src.c:78407 : 128 hits, %0 failures -ReSign|src.c:78411 : 128 hits, %0 failures -ReSign|src.c:71286 : 127 hits, %0 failures -ReSign|dlmalloc.c:4811 : 125 hits, %0 failures -ReSign|src.c:61509 : 125 hits, %0 failures -ReSign|src.c:69965 : 120 hits, %0 failures -ReSign|src.c:70405 : 118 hits, %0 failures -ReSign|src.c:70025 : 112 hits, %0 failures -ReSign|src.c:94265 : 112 hits, %0 failures -ReSign|src.c:78319 : 108 hits, %0 failures -UnSign|src.c:19235 : 106 hits, %0 failures -UnSign|src.c:19236 : 106 hits, %0 failures -ReSign|dlmalloc.c:4668 : 105 hits, %0 failures -ReSign|src.c:91493 : 105 hits, %0 failures -ReSign|src.c:70234 : 102 hits, %0 failures -ReSign|src.c:70235 : 102 hits, %0 failures -ReSign|src.c:98929 : 100 hits, %0 failures -UnSign|src.c:57160 : 98 hits, %0 failures -ReSign|src.c:57169 : 98 hits, %0 failures -UnSign|dlmalloc.c:4262 : 95 hits, %0 failures -ReSign|src.c:96342 : 92 hits, %0 failures -ReSign|dlmalloc.c:4642 : 90 hits, %0 failures -ReSign|src.c:74325 : 90 hits, %0 failures -ReSign|src.c:73375 : 90 hits, %0 failures -UnSign|src.c:72366 : 90 hits, %0 failures -UnSign|src.c:72361 : 88 hits, %0 failures -ReSign|src.c:19138 : 86 hits, %0 failures -ReSign|src.c:80570 : 84 hits, %0 failures -ReSign|src.c:93675 : 84 hits, %0 failures -ReSign|src.c:93740 : 84 hits, %0 failures -ReSign|src.c:70003 : 84 hits, %0 failures -ReSign|src.c:71022 : 84 hits, %0 failures -ReSign|src.c:70265 : 84 hits, %0 failures -ReSign|src.c:70431 : 84 hits, %0 failures -ReSign|src.c:71031 : 84 hits, %0 failures -ReSign|src.c:93928 : 84 hits, %0 failures -ReSign|src.c:102820 : 84 hits, %0 failures -ReSign|src.c:91655 : 84 hits, %0 failures -ReSign|src.c:57140 : 84 hits, %0 failures -ReSign|src.c:91604 : 84 hits, %0 failures -ReSign|src.c:91491 : 84 hits, %0 failures -UnSign|src.c:19918 : 84 hits, %0 failures -ReSign|src.c:19057 : 83 hits, %0 failures -ReSign|src.c:77845 : 80 hits, %0 failures -ReSign|dlmalloc.c:4765 : 79 hits, %0 failures -ReSign|src.c:69966 : 76 hits, %0 failures -ReSign|src.c:71531 : 76 hits, %0 failures -ReSign|src.c:63912 : 76 hits, %0 failures -ReSign|src.c:86971 : 76 hits, %0 failures -UnSign|src.c:98794 : 73 hits, %33 failures -ReSign|src.c:98794 : 73 hits, %0 failures -ReSign|src.c:77699 : 72 hits, %0 failures -ReSign|src.c:71341 : 72 hits, %0 failures -ReSign|src.c:19083 : 71 hits, %0 failures -ReSign|src.c:19086 : 71 hits, %0 failures -ReSign|src.c:19099 : 71 hits, %0 failures -ReSign|src.c:19103 : 71 hits, %0 failures -ReSign|src.c:19120 : 71 hits, %0 failures -ReSign|src.c:19150 : 71 hits, %0 failures -UnSign|src.c:19175 : 71 hits, %0 failures -ReSign|src.c:19511 : 71 hits, %0 failures -ReSign|src.c:19514 : 71 hits, %0 failures -ReSign|src.c:19518 : 71 hits, %0 failures -ReSign|src.c:19521 : 71 hits, %0 failures -ReSign|src.c:19528 : 71 hits, %0 failures -ReSign|src.c:70027 : 70 hits, %0 failures -ReSign|src.c:102926 : 70 hits, %0 failures -ReSign|src.c:102990 : 70 hits, %0 failures -ReSign|src.c:59248 : 70 hits, %0 failures -ReSign|src.c:19596 : 69 hits, %0 failures -ReSign|src.c:19063 : 68 hits, %0 failures -ReSign|src.c:86961 : 68 hits, %0 failures -ReSign|src.c:81487 : 68 hits, %0 failures -UnSign|src.c:48614 : 68 hits, %0 failures -ReSign|src.c:48658 : 68 hits, %0 failures -UnSign|src.c:48750 : 68 hits, %0 failures -ReSign|src.c:61677 : 66 hits, %0 failures -ReSign|src.c:81405 : 65 hits, %0 failures -ReSign|src.c:81407 : 65 hits, %0 failures -ReSign|dlmalloc.c:4634 : 64 hits, %0 failures -ReSign|src.c:78311 : 64 hits, %0 failures -ReSign|src.c:78434 : 64 hits, %0 failures -ReSign|src.c:91666 : 63 hits, %0 failures -ReSign|src.c:91494 : 63 hits, %0 failures -ReSign|src.c:69891 : 62 hits, %0 failures -ReSign|src.c:69776 : 62 hits, %0 failures -ReSign|src.c:74328 : 60 hits, %0 failures -ReSign|src.c:96466 : 60 hits, %0 failures -ReSign|dlmalloc.c:4266 : 58 hits, %0 failures -ReSign|src.c:70317 : 58 hits, %0 failures -UnSign|src.c:99994 : 58 hits, %0 failures -ReSign|src.c:102867 : 56 hits, %0 failures -ReSign|src.c:102928 : 56 hits, %0 failures -ReSign|src.c:103079 : 56 hits, %0 failures -ReSign|src.c:103141 : 56 hits, %0 failures -ReSign|src.c:103273 : 56 hits, %0 failures -ReSign|src.c:102606 : 56 hits, %0 failures -ReSign|src.c:91662 : 56 hits, %0 failures -ReSign|src.c:59276 : 56 hits, %0 failures -UnSign|src.c:59281 : 56 hits, %0 failures -ReSign|src.c:91477 : 56 hits, %0 failures -UnSign|src.c:19915 : 56 hits, %0 failures -UnSign|src.c:19916 : 56 hits, %0 failures -ReSign|src.c:69773 : 56 hits, %0 failures -ReSign|src.c:71374 : 56 hits, %0 failures -ReSign|src.c:81485 : 55 hits, %0 failures -ReSign|src.c:73271 : 55 hits, %0 failures -ReSign|src.c:73272 : 55 hits, %0 failures -UnSign|src.c:52166 : 55 hits, %0 failures -ReSign|src.c:52167 : 55 hits, %0 failures -UnSign|dlmalloc.c:4811 : 54 hits, %0 failures -ReSign|src.c:83823 : 53 hits, %0 failures -UnSign|src.c:19237 : 53 hits, %0 failures -ReSign|src.c:19454 : 52 hits, %0 failures -UnSign|src.c:19454 : 52 hits, %0 failures -ReSign|src.c:38480 : 52 hits, %0 failures -ReSign|src.c:50118 : 51 hits, %0 failures -ReSign|src.c:101217 : 51 hits, %0 failures -ReSign|src.c:98072 : 51 hits, %0 failures -ReSign|src.c:55493 : 51 hits, %0 failures -UnSign|src.c:55493 : 51 hits, %0 failures -ReSign|src.c:81362 : 51 hits, %0 failures -ReSign|src.c:38483 : 50 hits, %0 failures -ReSign|src.c:21745 : 50 hits, %0 failures -ReSign|src.c:81509 : 49 hits, %0 failures -ReSign|src.c:103107 : 49 hits, %0 failures -ReSign|src.c:57115 : 49 hits, %0 failures -UnSign|src.c:57120 : 49 hits, %0 failures -ReSign|src.c:57120 : 49 hits, %0 failures -ReSign|src.c:57121 : 49 hits, %0 failures -UnSign|src.c:57123 : 49 hits, %0 failures -ReSign|src.c:57123 : 49 hits, %0 failures -UnSign|src.c:57128 : 49 hits, %0 failures -ReSign|src.c:57135 : 49 hits, %0 failures -ReSign|src.c:57160 : 49 hits, %0 failures -UnSign|src.c:57161 : 49 hits, %0 failures -ReSign|src.c:57161 : 49 hits, %0 failures -UnSign|src.c:57164 : 49 hits, %0 failures -ReSign|src.c:57164 : 49 hits, %0 failures -ReSign|src.c:77703 : 48 hits, %0 failures -ReSign|src.c:80662 : 48 hits, %0 failures -ReSign|src.c:70669 : 48 hits, %0 failures -ReSign|src.c:108689 : 48 hits, %0 failures -ReSign|src.c:108691 : 48 hits, %0 failures -UnSign|src.c:81455 : 46 hits, %0 failures -ReSign|src.c:98847 : 46 hits, %0 failures -ReSign|src.c:34548 : 45 hits, %0 failures -ReSign|src.c:81481 : 44 hits, %0 failures -UnSign|src.c:98800 : 44 hits, %0 failures -ReSign|src.c:98800 : 44 hits, %0 failures -ReSign|src.c:98810 : 44 hits, %0 failures -ReSign|src.c:128446 : 44 hits, %0 failures -UnSign|src.c:74243 : 43 hits, %0 failures -ReSign|src.c:74194 : 43 hits, %0 failures -ReSign|src.c:74267 : 43 hits, %0 failures -ReSign|src.c:80628 : 42 hits, %0 failures -ReSign|src.c:80635 : 42 hits, %0 failures -ReSign|src.c:94223 : 42 hits, %0 failures -ReSign|src.c:90818 : 42 hits, %0 failures -ReSign|src.c:93860 : 42 hits, %0 failures -ReSign|src.c:70029 : 42 hits, %0 failures -ReSign|src.c:70195 : 42 hits, %0 failures -ReSign|src.c:70205 : 42 hits, %0 failures -ReSign|src.c:70219 : 42 hits, %0 failures -ReSign|src.c:70335 : 42 hits, %0 failures -ReSign|src.c:70360 : 42 hits, %0 failures -ReSign|src.c:70375 : 42 hits, %0 failures -ReSign|src.c:70385 : 42 hits, %0 failures -ReSign|src.c:70421 : 42 hits, %0 failures -ReSign|src.c:70423 : 42 hits, %0 failures -ReSign|src.c:77255 : 42 hits, %0 failures -ReSign|src.c:101191 : 42 hits, %0 failures -ReSign|src.c:103277 : 42 hits, %0 failures -ReSign|src.c:91650 : 42 hits, %0 failures -ReSign|src.c:91667 : 42 hits, %0 failures -UnSign|src.c:57137 : 42 hits, %0 failures -ReSign|src.c:57137 : 42 hits, %0 failures -UnSign|src.c:57138 : 42 hits, %0 failures -ReSign|src.c:57138 : 42 hits, %0 failures -ReSign|src.c:57143 : 42 hits, %0 failures -ReSign|src.c:37880 : 42 hits, %0 failures -ReSign|src.c:50085 : 41 hits, %0 failures -ReSign|src.c:81324 : 40 hits, %0 failures -ReSign|src.c:81273 : 40 hits, %0 failures -ReSign|src.c:81331 : 40 hits, %0 failures -ReSign|src.c:106591 : 40 hits, %0 failures -UnSign|src.c:107211 : 40 hits, %0 failures -ReSign|src.c:85153 : 40 hits, %0 failures -ReSign|src.c:49916 : 39 hits, %0 failures -UnSign|dlmalloc.c:4274 : 38 hits, %0 failures -UnSign|dlmalloc.c:4277 : 38 hits, %0 failures -ReSign|src.c:98734 : 38 hits, %0 failures -ReSign|src.c:74112 : 38 hits, %0 failures -ReSign|src.c:71391 : 38 hits, %0 failures -UnSign|src.c:34802 : 37 hits, %0 failures -ReSign|src.c:102793 : 36 hits, %0 failures -ReSign|src.c:99804 : 36 hits, %0 failures -ReSign|src.c:50655 : 36 hits, %0 failures -UnSign|src.c:71275 : 36 hits, %53 failures -ReSign|src.c:71276 : 36 hits, %0 failures -ReSign|src.c:71281 : 36 hits, %0 failures -ReSign|src.c:38841 : 36 hits, %0 failures -UnSign|src.c:91662 : 35 hits, %40 failures -ReSign|src.c:19931 : 35 hits, %0 failures -UnSign|src.c:81331 : 34 hits, %0 failures -ReSign|src.c:41517 : 34 hits, %0 failures -ReSign|src.c:41519 : 34 hits, %0 failures -ReSign|src.c:50120 : 34 hits, %0 failures -UnSign|src.c:50150 : 34 hits, %0 failures -ReSign|src.c:50150 : 34 hits, %0 failures -ReSign|src.c:70406 : 34 hits, %0 failures -ReSign|src.c:70408 : 34 hits, %0 failures -ReSign|src.c:59322 : 34 hits, %0 failures -ReSign|src.c:59354 : 34 hits, %0 failures -ReSign|src.c:59366 : 34 hits, %0 failures -ReSign|src.c:47906 : 34 hits, %0 failures -UnSign|src.c:38805 : 34 hits, %0 failures -ReSign|src.c:38805 : 34 hits, %0 failures -ReSign|src.c:101402 : 34 hits, %0 failures -UnSign|src.c:81365 : 34 hits, %0 failures -ReSign|src.c:81365 : 34 hits, %0 failures -UnSign|src.c:48609 : 34 hits, %0 failures -UnSign|src.c:48610 : 34 hits, %0 failures -UnSign|src.c:48611 : 34 hits, %0 failures -UnSign|src.c:48658 : 34 hits, %0 failures -ReSign|src.c:48749 : 34 hits, %0 failures -UnSign|dlmalloc.c:3745 : 33 hits, %0 failures -ReSign|src.c:19594 : 33 hits, %0 failures -UnSign|src.c:19596 : 33 hits, %0 failures -ReSign|src.c:108065 : 32 hits, %0 failures -ReSign|src.c:78309 : 32 hits, %0 failures -ReSign|src.c:78317 : 32 hits, %0 failures -ReSign|src.c:78325 : 32 hits, %0 failures -ReSign|src.c:101105 : 32 hits, %0 failures -ReSign|src.c:101400 : 32 hits, %0 failures -ReSign|src.c:96330 : 32 hits, %0 failures -ReSign|src.c:57436 : 32 hits, %0 failures -ReSign|src.c:96338 : 32 hits, %0 failures -ReSign|src.c:73248 : 32 hits, %0 failures -ReSign|src.c:73222 : 32 hits, %0 failures -ReSign|src.c:77432 : 32 hits, %0 failures -ReSign|src.c:71466 : 32 hits, %0 failures -ReSign|src.c:81209 : 32 hits, %0 failures -ReSign|src.c:81216 : 32 hits, %0 failures -ReSign|src.c:63914 : 32 hits, %0 failures -ReSign|src.c:103311 : 32 hits, %0 failures -ReSign|src.c:73537 : 31 hits, %0 failures -ReSign|src.c:73542 : 31 hits, %0 failures -UnSign|src.c:69891 : 31 hits, %0 failures -ReSign|src.c:69775 : 31 hits, %0 failures -ReSign|src.c:69778 : 31 hits, %0 failures -ReSign|dlmalloc.c:4284 : 30 hits, %0 failures -ReSign|src.c:49836 : 30 hits, %0 failures -UnSign|src.c:73378 : 30 hits, %0 failures -ReSign|src.c:73378 : 30 hits, %0 failures -ReSign|src.c:73381 : 30 hits, %0 failures -ReSign|src.c:96467 : 30 hits, %0 failures -ReSign|src.c:98689 : 30 hits, %0 failures -UnSign|src.c:74962 : 30 hits, %0 failures -UnSign|src.c:38842 : 30 hits, %0 failures -ReSign|src.c:98977 : 29 hits, %0 failures -ReSign|src.c:102541 : 29 hits, %0 failures -ReSign|src.c:98651 : 29 hits, %0 failures -ReSign|src.c:99495 : 29 hits, %0 failures -ReSign|src.c:71383 : 29 hits, %0 failures -UnSign|src.c:105736 : 28 hits, %0 failures -ReSign|src.c:72298 : 28 hits, %0 failures -ReSign|src.c:80691 : 28 hits, %0 failures -ReSign|src.c:80693 : 28 hits, %0 failures -ReSign|src.c:93659 : 28 hits, %0 failures -ReSign|src.c:93708 : 28 hits, %0 failures -ReSign|src.c:93726 : 28 hits, %0 failures -UnSign|src.c:93742 : 28 hits, %0 failures -ReSign|src.c:93742 : 28 hits, %0 failures -UnSign|src.c:93745 : 28 hits, %0 failures -ReSign|src.c:93745 : 28 hits, %0 failures -ReSign|src.c:93747 : 28 hits, %0 failures -ReSign|src.c:69979 : 28 hits, %0 failures -ReSign|src.c:69980 : 28 hits, %0 failures -ReSign|src.c:69981 : 28 hits, %0 failures -ReSign|src.c:69982 : 28 hits, %0 failures -ReSign|src.c:69983 : 28 hits, %0 failures -ReSign|src.c:69984 : 28 hits, %0 failures -ReSign|src.c:69985 : 28 hits, %0 failures -ReSign|src.c:70030 : 28 hits, %0 failures -ReSign|src.c:70002 : 28 hits, %0 failures -ReSign|src.c:70004 : 28 hits, %0 failures -ReSign|src.c:70031 : 28 hits, %0 failures -ReSign|src.c:93984 : 28 hits, %0 failures -ReSign|src.c:70997 : 28 hits, %0 failures -ReSign|src.c:71024 : 28 hits, %0 failures -ReSign|src.c:71047 : 28 hits, %0 failures -ReSign|src.c:71086 : 28 hits, %0 failures -ReSign|src.c:93986 : 28 hits, %0 failures -ReSign|src.c:93930 : 28 hits, %0 failures -ReSign|src.c:94242 : 28 hits, %0 failures -UnSign|src.c:94245 : 28 hits, %0 failures -ReSign|src.c:90996 : 28 hits, %0 failures -UnSign|src.c:94312 : 28 hits, %0 failures -ReSign|src.c:74722 : 28 hits, %0 failures -ReSign|src.c:71336 : 28 hits, %0 failures -ReSign|src.c:71339 : 28 hits, %0 failures -ReSign|src.c:81235 : 28 hits, %0 failures -ReSign|src.c:71361 : 28 hits, %0 failures -ReSign|src.c:102742 : 28 hits, %0 failures -ReSign|src.c:102752 : 28 hits, %0 failures -ReSign|src.c:102823 : 28 hits, %0 failures -UnSign|src.c:102933 : 28 hits, %0 failures -ReSign|src.c:102934 : 28 hits, %0 failures -ReSign|src.c:102941 : 28 hits, %0 failures -ReSign|src.c:99989 : 28 hits, %0 failures -ReSign|src.c:103051 : 28 hits, %0 failures -ReSign|src.c:103088 : 28 hits, %0 failures -ReSign|src.c:91039 : 28 hits, %0 failures -ReSign|src.c:91216 : 28 hits, %0 failures -ReSign|src.c:103226 : 28 hits, %0 failures -UnSign|src.c:103277 : 28 hits, %0 failures -ReSign|src.c:98661 : 28 hits, %0 failures -ReSign|src.c:94853 : 28 hits, %0 failures -UnSign|src.c:91650 : 28 hits, %0 failures -ReSign|src.c:91658 : 28 hits, %0 failures -ReSign|src.c:91659 : 28 hits, %0 failures -UnSign|src.c:91479 : 28 hits, %25 failures -ReSign|src.c:91580 : 28 hits, %0 failures -ReSign|src.c:72279 : 28 hits, %0 failures -ReSign|src.c:99503 : 28 hits, %0 failures -UnSign|src.c:37880 : 28 hits, %0 failures -ReSign|src.c:19893 : 28 hits, %0 failures -UnSign|src.c:19914 : 28 hits, %0 failures -UnSign|src.c:19917 : 28 hits, %0 failures -UnSign|src.c:19919 : 28 hits, %0 failures -UnSign|src.c:38195 : 28 hits, %0 failures -UnSign|src.c:38233 : 28 hits, %0 failures -UnSign|dlmalloc.c:4278 : 28 hits, %0 failures -ReSign|src.c:74937 : 28 hits, %0 failures -ReSign|src.c:94483 : 28 hits, %0 failures -ReSign|src.c:103312 : 28 hits, %0 failures -UnSign|src.c:19446 : 26 hits, %0 failures -ReSign|src.c:19446 : 26 hits, %0 failures -ReSign|src.c:19448 : 26 hits, %0 failures -UnSign|src.c:19448 : 26 hits, %0 failures -ReSign|src.c:19449 : 26 hits, %0 failures -ReSign|src.c:19456 : 26 hits, %0 failures -ReSign|src.c:19466 : 26 hits, %0 failures -ReSign|src.c:19472 : 26 hits, %0 failures -ReSign|src.c:103098 : 26 hits, %0 failures -ReSign|src.c:103282 : 26 hits, %0 failures -ReSign|src.c:63828 : 26 hits, %0 failures -UnSign|src.c:49892 : 26 hits, %0 failures -UnSign|src.c:49893 : 26 hits, %0 failures -ReSign|src.c:49901 : 26 hits, %0 failures -ReSign|src.c:81499 : 25 hits, %0 failures -UnSign|src.c:63914 : 25 hits, %0 failures -UnSign|src.c:61509 : 25 hits, %0 failures -ReSign|src.c:61569 : 25 hits, %0 failures -ReSign|src.c:86973 : 25 hits, %0 failures -ReSign|src.c:89699 : 24 hits, %0 failures -ReSign|src.c:77700 : 24 hits, %0 failures -UnSign|src.c:50085 : 24 hits, %0 failures -ReSign|src.c:19429 : 24 hits, %0 failures -UnSign|src.c:19431 : 24 hits, %0 failures -ReSign|src.c:19431 : 24 hits, %0 failures -ReSign|src.c:19434 : 24 hits, %0 failures -ReSign|src.c:70925 : 24 hits, %0 failures -ReSign|src.c:70880 : 24 hits, %0 failures -ReSign|src.c:91250 : 24 hits, %0 failures -UnSign|src.c:71340 : 24 hits, %0 failures -ReSign|src.c:71347 : 24 hits, %0 failures -ReSign|src.c:71348 : 24 hits, %0 failures -ReSign|src.c:99834 : 24 hits, %0 failures -ReSign|src.c:59333 : 24 hits, %0 failures -UnSign|src.c:107349 : 24 hits, %0 failures -ReSign|src.c:96438 : 24 hits, %0 failures -ReSign|src.c:96462 : 24 hits, %0 failures -ReSign|src.c:96692 : 24 hits, %0 failures -ReSign|src.c:57775 : 24 hits, %0 failures -ReSign|src.c:74271 : 24 hits, %0 failures -UnSign|src.c:48933 : 24 hits, %0 failures -UnSign|src.c:48934 : 24 hits, %0 failures -UnSign|src.c:48935 : 24 hits, %0 failures -UnSign|src.c:48974 : 24 hits, %0 failures -ReSign|src.c:77015 : 24 hits, %0 failures -ReSign|src.c:77792 : 24 hits, %0 failures -ReSign|src.c:108704 : 24 hits, %0 failures -ReSign|src.c:18335 : 23 hits, %0 failures -ReSign|src.c:81455 : 23 hits, %0 failures -ReSign|src.c:81460 : 23 hits, %0 failures -ReSign|src.c:94356 : 22 hits, %0 failures -ReSign|src.c:98733 : 22 hits, %0 failures -ReSign|src.c:101265 : 22 hits, %0 failures -ReSign|src.c:101447 : 22 hits, %0 failures -ReSign|src.c:101472 : 22 hits, %0 failures -ReSign|src.c:103104 : 22 hits, %0 failures -UnSign|src.c:74971 : 22 hits, %0 failures -ReSign|src.c:61685 : 22 hits, %0 failures -ReSign|src.c:58152 : 22 hits, %0 failures -ReSign|src.c:94407 : 21 hits, %0 failures -ReSign|src.c:91665 : 21 hits, %0 failures -ReSign|src.c:91671 : 21 hits, %0 failures -ReSign|src.c:91673 : 21 hits, %0 failures -ReSign|src.c:91678 : 21 hits, %0 failures -ReSign|src.c:91681 : 21 hits, %0 failures -ReSign|src.c:91488 : 21 hits, %0 failures -ReSign|src.c:91502 : 21 hits, %0 failures -ReSign|src.c:91524 : 21 hits, %0 failures -ReSign|src.c:91541 : 21 hits, %0 failures -ReSign|src.c:91544 : 21 hits, %0 failures -ReSign|src.c:91546 : 21 hits, %0 failures -ReSign|src.c:91554 : 21 hits, %0 failures -UnSign|src.c:19182 : 21 hits, %0 failures -ReSign|src.c:19182 : 21 hits, %0 failures -ReSign|src.c:19184 : 21 hits, %0 failures -ReSign|src.c:19191 : 21 hits, %0 failures -ReSign|src.c:19200 : 21 hits, %0 failures -ReSign|src.c:19201 : 21 hits, %0 failures -ReSign|src.c:19214 : 21 hits, %0 failures -UnSign|src.c:19215 : 21 hits, %0 failures -ReSign|src.c:19215 : 21 hits, %0 failures -UnSign|src.c:19219 : 21 hits, %0 failures -ReSign|src.c:19219 : 21 hits, %0 failures -UnSign|src.c:19232 : 21 hits, %0 failures -UnSign|src.c:19233 : 21 hits, %0 failures -ReSign|src.c:19240 : 21 hits, %0 failures -ReSign|src.c:19243 : 21 hits, %0 failures -UnSign|src.c:19244 : 21 hits, %0 failures -ReSign|src.c:19244 : 21 hits, %0 failures -ReSign|dlmalloc.c:4076 : 21 hits, %0 failures -ReSign|dlmalloc.c:4113 : 21 hits, %0 failures -ReSign|src.c:74936 : 21 hits, %0 failures -ReSign|src.c:109580 : 20 hits, %0 failures -ReSign|src.c:109583 : 20 hits, %0 failures -ReSign|src.c:78055 : 20 hits, %0 failures -ReSign|src.c:107499 : 20 hits, %0 failures -UnSign|src.c:107299 : 20 hits, %0 failures -ReSign|src.c:107211 : 20 hits, %0 failures -ReSign|src.c:96468 : 20 hits, %0 failures -ReSign|src.c:96476 : 20 hits, %0 failures -ReSign|src.c:96693 : 20 hits, %0 failures -UnSign|dlmalloc.c:4268 : 20 hits, %0 failures -ReSign|src.c:69813 : 20 hits, %0 failures -UnSign|dlmalloc.c:4648 : 20 hits, %0 failures -ReSign|src.c:94007 : 20 hits, %0 failures -ReSign|src.c:94053 : 20 hits, %0 failures -ReSign|src.c:94033 : 20 hits, %0 failures -ReSign|src.c:73359 : 20 hits, %0 failures -UnSign|dlmalloc.c:4279 : 19 hits, %0 failures -UnSign|src.c:50628 : 19 hits, %0 failures -ReSign|src.c:50628 : 19 hits, %0 failures -UnSign|src.c:50711 : 19 hits, %0 failures -ReSign|src.c:50711 : 19 hits, %0 failures -UnSign|src.c:50655 : 19 hits, %0 failures -UnSign|src.c:50666 : 19 hits, %0 failures -ReSign|src.c:50666 : 19 hits, %0 failures -ReSign|src.c:38540 : 19 hits, %0 failures -ReSign|src.c:38544 : 19 hits, %0 failures -ReSign|src.c:38589 : 19 hits, %0 failures -ReSign|src.c:98040 : 19 hits, %0 failures -UnSign|src.c:98734 : 19 hits, %0 failures -UnSign|src.c:19597 : 18 hits, %0 failures -ReSign|src.c:19597 : 18 hits, %0 failures -ReSign|src.c:19602 : 18 hits, %0 failures -ReSign|src.c:19654 : 18 hits, %0 failures -ReSign|src.c:70671 : 18 hits, %0 failures -ReSign|src.c:101194 : 18 hits, %0 failures -ReSign|src.c:101247 : 18 hits, %0 failures -ReSign|src.c:99813 : 18 hits, %0 failures -UnSign|src.c:101285 : 18 hits, %0 failures -ReSign|src.c:101286 : 18 hits, %0 failures -ReSign|src.c:101311 : 18 hits, %0 failures -ReSign|src.c:101327 : 18 hits, %0 failures -ReSign|src.c:101371 : 18 hits, %0 failures -ReSign|src.c:101460 : 18 hits, %0 failures -ReSign|src.c:103233 : 18 hits, %0 failures -UnSign|src.c:106038 : 18 hits, %0 failures -UnSign|src.c:71697 : 18 hits, %0 failures -ReSign|src.c:71697 : 18 hits, %0 failures -UnSign|src.c:71704 : 18 hits, %0 failures -ReSign|src.c:71704 : 18 hits, %0 failures -ReSign|src.c:72320 : 18 hits, %0 failures -ReSign|src.c:98935 : 18 hits, %0 failures -UnSign|src.c:71440 : 18 hits, %0 failures -UnSign|src.c:57259 : 18 hits, %0 failures -ReSign|src.c:57259 : 18 hits, %0 failures -ReSign|src.c:108529 : 18 hits, %0 failures -UnSign|src.c:36146 : 18 hits, %0 failures -ReSign|src.c:78636 : 18 hits, %0 failures -ReSign|src.c:108705 : 18 hits, %0 failures -UnSign|src.c:50075 : 17 hits, %0 failures -ReSign|src.c:50075 : 17 hits, %0 failures -ReSign|src.c:50087 : 17 hits, %0 failures -ReSign|src.c:50096 : 17 hits, %0 failures -ReSign|src.c:50107 : 17 hits, %0 failures -ReSign|src.c:50109 : 17 hits, %0 failures -UnSign|src.c:50109 : 17 hits, %0 failures -UnSign|src.c:41517 : 17 hits, %0 failures -UnSign|src.c:41519 : 17 hits, %0 failures -ReSign|src.c:41689 : 17 hits, %0 failures -UnSign|src.c:41694 : 17 hits, %0 failures -ReSign|src.c:41694 : 17 hits, %0 failures -ReSign|src.c:41699 : 17 hits, %0 failures -ReSign|src.c:49827 : 17 hits, %0 failures -ReSign|src.c:49829 : 17 hits, %0 failures -ReSign|src.c:49839 : 17 hits, %0 failures -UnSign|src.c:49944 : 17 hits, %0 failures -UnSign|src.c:49945 : 17 hits, %0 failures -UnSign|src.c:49947 : 17 hits, %0 failures -ReSign|src.c:50131 : 17 hits, %0 failures -ReSign|src.c:50134 : 17 hits, %0 failures -ReSign|src.c:50137 : 17 hits, %0 failures -UnSign|src.c:50138 : 17 hits, %0 failures -ReSign|src.c:50138 : 17 hits, %0 failures -ReSign|src.c:50141 : 17 hits, %0 failures -ReSign|src.c:50149 : 17 hits, %0 failures -ReSign|src.c:50153 : 17 hits, %0 failures -ReSign|src.c:59754 : 17 hits, %0 failures -ReSign|src.c:59756 : 17 hits, %0 failures -ReSign|src.c:59328 : 17 hits, %0 failures -ReSign|src.c:59349 : 17 hits, %0 failures -UnSign|src.c:50718 : 17 hits, %0 failures -ReSign|src.c:50718 : 17 hits, %0 failures -ReSign|src.c:47890 : 17 hits, %0 failures -ReSign|src.c:50669 : 17 hits, %0 failures -UnSign|src.c:38807 : 17 hits, %0 failures -ReSign|src.c:38807 : 17 hits, %0 failures -ReSign|src.c:38811 : 17 hits, %0 failures -ReSign|src.c:59370 : 17 hits, %0 failures -ReSign|src.c:59769 : 17 hits, %0 failures -ReSign|src.c:59772 : 17 hits, %0 failures -ReSign|src.c:83704 : 17 hits, %0 failures -ReSign|src.c:101550 : 17 hits, %0 failures -UnSign|src.c:101401 : 17 hits, %0 failures -ReSign|src.c:101401 : 17 hits, %0 failures -UnSign|src.c:101403 : 17 hits, %0 failures -ReSign|src.c:101403 : 17 hits, %0 failures -ReSign|src.c:74534 : 17 hits, %0 failures -ReSign|src.c:74535 : 17 hits, %0 failures -ReSign|src.c:71291 : 17 hits, %0 failures -ReSign|src.c:71292 : 17 hits, %0 failures -ReSign|src.c:21942 : 16 hits, %0 failures -ReSign|src.c:21948 : 16 hits, %0 failures -ReSign|src.c:21959 : 16 hits, %0 failures -ReSign|src.c:108976 : 16 hits, %0 failures -ReSign|src.c:78135 : 16 hits, %0 failures -ReSign|src.c:78151 : 16 hits, %0 failures -ReSign|src.c:78205 : 16 hits, %0 failures -ReSign|src.c:78824 : 16 hits, %0 failures -ReSign|src.c:80663 : 16 hits, %0 failures -ReSign|src.c:80665 : 16 hits, %0 failures -ReSign|src.c:103058 : 16 hits, %0 failures -ReSign|src.c:103068 : 16 hits, %0 failures -ReSign|src.c:101969 : 16 hits, %0 failures -UnSign|src.c:101969 : 16 hits, %0 failures -ReSign|src.c:103285 : 16 hits, %0 failures -ReSign|src.c:103303 : 16 hits, %0 failures -UnSign|src.c:71463 : 16 hits, %0 failures -ReSign|src.c:71463 : 16 hits, %0 failures -UnSign|src.c:71466 : 16 hits, %0 failures -ReSign|src.c:81206 : 16 hits, %0 failures -ReSign|src.c:81239 : 16 hits, %0 failures -ReSign|src.c:71471 : 16 hits, %0 failures -ReSign|src.c:74994 : 16 hits, %0 failures -ReSign|src.c:79930 : 16 hits, %0 failures -ReSign|src.c:79991 : 16 hits, %0 failures -ReSign|src.c:80246 : 16 hits, %0 failures -ReSign|src.c:81099 : 16 hits, %0 failures -ReSign|src.c:85110 : 16 hits, %0 failures -ReSign|src.c:18584 : 15 hits, %0 failures -UnSign|src.c:101217 : 15 hits, %0 failures -ReSign|src.c:101219 : 15 hits, %0 failures -ReSign|src.c:99464 : 15 hits, %0 failures -UnSign|src.c:99471 : 15 hits, %0 failures -ReSign|src.c:99472 : 15 hits, %0 failures -ReSign|src.c:99479 : 15 hits, %0 failures -UnSign|src.c:99485 : 15 hits, %0 failures -ReSign|src.c:99485 : 15 hits, %0 failures -UnSign|src.c:98847 : 15 hits, %0 failures -UnSign|src.c:99595 : 15 hits, %0 failures -ReSign|src.c:99595 : 15 hits, %0 failures -UnSign|src.c:83704 : 15 hits, %0 failures -ReSign|src.c:99008 : 15 hits, %0 failures -ReSign|src.c:99596 : 15 hits, %0 failures -UnSign|src.c:99091 : 15 hits, %0 failures -ReSign|src.c:99091 : 15 hits, %0 failures -ReSign|src.c:99655 : 15 hits, %0 failures -UnSign|src.c:98930 : 15 hits, %0 failures -UnSign|src.c:99995 : 15 hits, %0 failures -ReSign|src.c:99995 : 15 hits, %0 failures -UnSign|src.c:102545 : 15 hits, %0 failures -ReSign|src.c:102545 : 15 hits, %0 failures -UnSign|src.c:98652 : 15 hits, %0 failures -ReSign|src.c:98652 : 15 hits, %0 failures -UnSign|src.c:98655 : 15 hits, %0 failures -ReSign|src.c:98655 : 15 hits, %0 failures -UnSign|src.c:98657 : 15 hits, %0 failures -ReSign|src.c:98657 : 15 hits, %0 failures -UnSign|src.c:57388 : 15 hits, %0 failures -UnSign|src.c:56612 : 15 hits, %0 failures -ReSign|src.c:56623 : 15 hits, %0 failures -ReSign|src.c:56633 : 15 hits, %0 failures -ReSign|src.c:19740 : 15 hits, %0 failures -ReSign|src.c:19122 : 15 hits, %0 failures -ReSign|src.c:19123 : 15 hits, %0 failures -ReSign|src.c:19125 : 15 hits, %0 failures -UnSign|src.c:19138 : 15 hits, %0 failures -UnSign|src.c:56641 : 15 hits, %0 failures -ReSign|src.c:14306 : 15 hits, %0 failures -ReSign|src.c:70589 : 15 hits, %0 failures -ReSign|src.c:93581 : 15 hits, %0 failures -ReSign|src.c:18720 : 15 hits, %0 failures -ReSign|src.c:18726 : 15 hits, %0 failures -ReSign|src.c:109592 : 14 hits, %0 failures -ReSign|src.c:21961 : 14 hits, %0 failures -UnSign|src.c:21966 : 14 hits, %0 failures -ReSign|src.c:21972 : 14 hits, %0 failures -ReSign|src.c:21776 : 14 hits, %0 failures -ReSign|src.c:21783 : 14 hits, %0 failures -ReSign|src.c:21791 : 14 hits, %0 failures -ReSign|src.c:80638 : 14 hits, %0 failures -ReSign|src.c:80640 : 14 hits, %0 failures -ReSign|src.c:90556 : 14 hits, %0 failures -ReSign|src.c:90560 : 14 hits, %0 failures -ReSign|src.c:90569 : 14 hits, %0 failures -ReSign|src.c:90577 : 14 hits, %0 failures -UnSign|src.c:94223 : 14 hits, %0 failures -ReSign|src.c:94226 : 14 hits, %0 failures -UnSign|src.c:94229 : 14 hits, %0 failures -ReSign|src.c:94229 : 14 hits, %0 failures -ReSign|src.c:93980 : 14 hits, %0 failures -UnSign|src.c:93982 : 14 hits, %0 failures -ReSign|src.c:93982 : 14 hits, %0 failures -ReSign|src.c:93656 : 14 hits, %0 failures -UnSign|src.c:93659 : 14 hits, %0 failures -UnSign|src.c:93662 : 14 hits, %0 failures -ReSign|src.c:80569 : 14 hits, %0 failures -ReSign|src.c:80571 : 14 hits, %0 failures -ReSign|src.c:80573 : 14 hits, %0 failures -ReSign|src.c:93677 : 14 hits, %0 failures -ReSign|src.c:93683 : 14 hits, %0 failures -ReSign|src.c:93705 : 14 hits, %0 failures -UnSign|src.c:93708 : 14 hits, %0 failures -ReSign|src.c:93719 : 14 hits, %0 failures -UnSign|src.c:93726 : 14 hits, %0 failures -UnSign|src.c:93984 : 14 hits, %0 failures -UnSign|src.c:70974 : 14 hits, %0 failures -ReSign|src.c:70974 : 14 hits, %0 failures -UnSign|src.c:70989 : 14 hits, %0 failures -ReSign|src.c:70989 : 14 hits, %0 failures -ReSign|src.c:70994 : 14 hits, %0 failures -UnSign|src.c:70994 : 14 hits, %0 failures -UnSign|src.c:71000 : 14 hits, %0 failures -ReSign|src.c:71007 : 14 hits, %0 failures -ReSign|src.c:71008 : 14 hits, %0 failures -ReSign|src.c:71033 : 14 hits, %0 failures -UnSign|src.c:71047 : 14 hits, %0 failures -ReSign|src.c:71055 : 14 hits, %0 failures -ReSign|src.c:71069 : 14 hits, %0 failures -ReSign|src.c:71070 : 14 hits, %0 failures -ReSign|src.c:70922 : 14 hits, %0 failures -ReSign|src.c:71089 : 14 hits, %0 failures -ReSign|src.c:71096 : 14 hits, %0 failures -ReSign|src.c:71120 : 14 hits, %0 failures -UnSign|src.c:93986 : 14 hits, %0 failures -UnSign|src.c:93924 : 14 hits, %0 failures -ReSign|src.c:93924 : 14 hits, %0 failures -UnSign|src.c:93925 : 14 hits, %0 failures -UnSign|src.c:93930 : 14 hits, %0 failures -UnSign|src.c:94242 : 14 hits, %0 failures -ReSign|src.c:94245 : 14 hits, %0 failures -ReSign|src.c:94251 : 14 hits, %0 failures -UnSign|src.c:90995 : 14 hits, %0 failures -ReSign|src.c:94257 : 14 hits, %0 failures -ReSign|src.c:94271 : 14 hits, %0 failures -ReSign|src.c:94312 : 14 hits, %0 failures -ReSign|src.c:94317 : 14 hits, %0 failures -UnSign|src.c:94343 : 14 hits, %0 failures -ReSign|src.c:94343 : 14 hits, %0 failures -ReSign|src.c:94368 : 14 hits, %0 failures -UnSign|src.c:94382 : 14 hits, %0 failures -ReSign|src.c:94382 : 14 hits, %0 failures -ReSign|src.c:91910 : 14 hits, %0 failures -ReSign|src.c:91920 : 14 hits, %0 failures -UnSign|src.c:94394 : 14 hits, %0 failures -ReSign|src.c:94394 : 14 hits, %0 failures -UnSign|src.c:102752 : 14 hits, %0 failures -ReSign|src.c:102768 : 14 hits, %0 failures -ReSign|src.c:74298 : 14 hits, %0 failures -UnSign|src.c:102823 : 14 hits, %0 failures -ReSign|src.c:102845 : 14 hits, %0 failures -UnSign|src.c:102926 : 14 hits, %0 failures -ReSign|src.c:102933 : 14 hits, %0 failures -ReSign|src.c:102936 : 14 hits, %0 failures -ReSign|src.c:102940 : 14 hits, %0 failures -ReSign|src.c:102942 : 14 hits, %0 failures -UnSign|src.c:102948 : 14 hits, %0 failures -ReSign|src.c:102948 : 14 hits, %0 failures -UnSign|src.c:101064 : 14 hits, %0 failures -ReSign|src.c:101064 : 14 hits, %0 failures -ReSign|src.c:101070 : 14 hits, %0 failures -UnSign|src.c:101090 : 14 hits, %0 failures -ReSign|src.c:101090 : 14 hits, %0 failures -UnSign|src.c:99989 : 14 hits, %0 failures -ReSign|src.c:100100 : 14 hits, %0 failures -ReSign|src.c:100104 : 14 hits, %0 failures -ReSign|src.c:102966 : 14 hits, %0 failures -ReSign|src.c:103006 : 14 hits, %0 failures -ReSign|src.c:103014 : 14 hits, %0 failures -ReSign|src.c:103021 : 14 hits, %0 failures -ReSign|src.c:103038 : 14 hits, %0 failures -UnSign|src.c:103051 : 14 hits, %0 failures -UnSign|src.c:103068 : 14 hits, %0 failures -UnSign|src.c:103083 : 14 hits, %0 failures -UnSign|src.c:103088 : 14 hits, %0 failures -ReSign|src.c:103092 : 14 hits, %0 failures -ReSign|src.c:103116 : 14 hits, %0 failures -ReSign|src.c:103120 : 14 hits, %0 failures -ReSign|src.c:103134 : 14 hits, %0 failures -UnSign|src.c:103143 : 14 hits, %0 failures -UnSign|src.c:101865 : 14 hits, %0 failures -ReSign|src.c:101865 : 14 hits, %0 failures -UnSign|src.c:101966 : 14 hits, %0 failures -ReSign|src.c:101968 : 14 hits, %0 failures -UnSign|src.c:101968 : 14 hits, %0 failures -UnSign|src.c:101989 : 14 hits, %0 failures -ReSign|src.c:101989 : 14 hits, %0 failures -ReSign|src.c:101996 : 14 hits, %0 failures -ReSign|src.c:102039 : 14 hits, %0 failures -ReSign|src.c:102564 : 14 hits, %0 failures -UnSign|src.c:91031 : 14 hits, %0 failures -ReSign|src.c:91036 : 14 hits, %0 failures -ReSign|src.c:91038 : 14 hits, %0 failures -UnSign|src.c:91038 : 14 hits, %0 failures -ReSign|src.c:90945 : 14 hits, %0 failures -ReSign|src.c:91045 : 14 hits, %0 failures -ReSign|src.c:91050 : 14 hits, %0 failures -ReSign|src.c:91058 : 14 hits, %0 failures -ReSign|src.c:91062 : 14 hits, %0 failures -ReSign|src.c:91067 : 14 hits, %0 failures -UnSign|src.c:91067 : 14 hits, %0 failures -ReSign|src.c:91075 : 14 hits, %0 failures -ReSign|src.c:91185 : 14 hits, %0 failures -ReSign|src.c:91190 : 14 hits, %0 failures -UnSign|src.c:103229 : 14 hits, %15 failures -ReSign|src.c:103229 : 14 hits, %0 failures -ReSign|src.c:103245 : 14 hits, %0 failures -UnSign|src.c:103274 : 14 hits, %0 failures -ReSign|src.c:102604 : 14 hits, %0 failures -ReSign|src.c:102608 : 14 hits, %0 failures -ReSign|src.c:102615 : 14 hits, %0 failures -ReSign|src.c:94824 : 14 hits, %0 failures -ReSign|src.c:94831 : 14 hits, %0 failures -UnSign|src.c:94853 : 14 hits, %0 failures -ReSign|src.c:91645 : 14 hits, %0 failures -ReSign|src.c:91652 : 14 hits, %0 failures -UnSign|src.c:91652 : 14 hits, %0 failures -ReSign|src.c:91653 : 14 hits, %0 failures -UnSign|src.c:91653 : 14 hits, %0 failures -UnSign|src.c:59242 : 14 hits, %0 failures -ReSign|src.c:59247 : 14 hits, %0 failures -ReSign|src.c:72273 : 14 hits, %0 failures -UnSign|src.c:99498 : 14 hits, %0 failures -ReSign|src.c:99498 : 14 hits, %0 failures -ReSign|src.c:99500 : 14 hits, %0 failures -ReSign|src.c:98893 : 14 hits, %0 failures -ReSign|src.c:98895 : 14 hits, %0 failures -UnSign|src.c:99503 : 14 hits, %86 failures -UnSign|src.c:109445 : 14 hits, %0 failures -ReSign|src.c:42052 : 14 hits, %0 failures -ReSign|src.c:41947 : 14 hits, %0 failures -UnSign|src.c:38146 : 14 hits, %0 failures -ReSign|src.c:38154 : 14 hits, %0 failures -ReSign|src.c:38233 : 14 hits, %0 failures -ReSign|src.c:50167 : 14 hits, %0 failures -ReSign|src.c:42704 : 14 hits, %0 failures -ReSign|src.c:38629 : 14 hits, %0 failures -ReSign|src.c:74860 : 14 hits, %0 failures -ReSign|src.c:74865 : 14 hits, %0 failures -ReSign|src.c:80354 : 14 hits, %0 failures -ReSign|src.c:80363 : 14 hits, %0 failures -ReSign|src.c:71430 : 14 hits, %0 failures -ReSign|src.c:98953 : 14 hits, %0 failures -ReSign|src.c:98956 : 14 hits, %0 failures -ReSign|src.c:81538 : 14 hits, %0 failures -ReSign|src.c:94419 : 13 hits, %0 failures -ReSign|src.c:69781 : 13 hits, %0 failures -ReSign|src.c:69785 : 13 hits, %0 failures -UnSign|src.c:57033 : 13 hits, %0 failures -ReSign|src.c:57033 : 13 hits, %0 failures -UnSign|src.c:57034 : 13 hits, %0 failures -UnSign|src.c:57036 : 13 hits, %0 failures -UnSign|src.c:63828 : 13 hits, %0 failures -UnSign|src.c:74197 : 13 hits, %0 failures -ReSign|src.c:74197 : 13 hits, %0 failures -ReSign|src.c:63877 : 13 hits, %0 failures -ReSign|src.c:63900 : 13 hits, %0 failures -ReSign|src.c:63921 : 13 hits, %0 failures -ReSign|src.c:86956 : 13 hits, %0 failures -ReSign|src.c:86969 : 13 hits, %0 failures -ReSign|src.c:86979 : 13 hits, %0 failures -ReSign|src.c:49844 : 13 hits, %0 failures -UnSign|src.c:49856 : 13 hits, %0 failures -ReSign|src.c:49856 : 13 hits, %0 failures -UnSign|src.c:49859 : 13 hits, %0 failures -ReSign|src.c:49859 : 13 hits, %0 failures -UnSign|src.c:49871 : 13 hits, %0 failures -ReSign|src.c:49871 : 13 hits, %0 failures -ReSign|src.c:49889 : 13 hits, %0 failures -ReSign|src.c:49893 : 13 hits, %0 failures -UnSign|src.c:49900 : 13 hits, %0 failures -UnSign|src.c:49920 : 13 hits, %0 failures -ReSign|src.c:49926 : 13 hits, %0 failures -ReSign|src.c:49927 : 13 hits, %0 failures -ReSign|src.c:128447 : 13 hits, %0 failures -ReSign|src.c:108126 : 12 hits, %0 failures -ReSign|src.c:14534 : 12 hits, %0 failures -ReSign|src.c:40288 : 12 hits, %0 failures -ReSign|src.c:21597 : 12 hits, %0 failures -ReSign|src.c:78026 : 12 hits, %0 failures -UnSign|src.c:78026 : 12 hits, %0 failures -ReSign|src.c:77706 : 12 hits, %0 failures -ReSign|src.c:89877 : 12 hits, %0 failures -ReSign|src.c:105857 : 12 hits, %0 failures -ReSign|src.c:70871 : 12 hits, %0 failures -ReSign|src.c:70873 : 12 hits, %0 failures -ReSign|src.c:74299 : 12 hits, %0 failures -ReSign|src.c:101248 : 12 hits, %0 failures -ReSign|src.c:99855 : 12 hits, %0 failures -ReSign|src.c:99866 : 12 hits, %0 failures -ReSign|src.c:99743 : 12 hits, %0 failures -ReSign|src.c:99878 : 12 hits, %0 failures -UnSign|src.c:103098 : 12 hits, %0 failures -UnSign|src.c:103100 : 12 hits, %0 failures -ReSign|src.c:103100 : 12 hits, %0 failures -ReSign|src.c:102059 : 12 hits, %0 failures -ReSign|src.c:102124 : 12 hits, %0 failures -ReSign|src.c:58243 : 12 hits, %0 failures -UnSign|src.c:103230 : 12 hits, %0 failures -ReSign|src.c:67108 : 12 hits, %0 failures -ReSign|src.c:67117 : 12 hits, %0 failures -ReSign|src.c:107349 : 12 hits, %0 failures -ReSign|src.c:18673 : 12 hits, %0 failures -ReSign|src.c:86958 : 12 hits, %0 failures -UnSign|src.c:34455 : 12 hits, %0 failures -UnSign|src.c:53310 : 12 hits, %0 failures -UnSign|src.c:53312 : 12 hits, %0 failures -UnSign|src.c:48927 : 12 hits, %0 failures -UnSign|src.c:48932 : 12 hits, %0 failures -UnSign|src.c:48948 : 12 hits, %0 failures -UnSign|src.c:48975 : 12 hits, %0 failures -ReSign|src.c:49000 : 12 hits, %0 failures -ReSign|src.c:57990 : 12 hits, %0 failures -ReSign|src.c:73342 : 12 hits, %0 failures -ReSign|src.c:79997 : 12 hits, %0 failures -ReSign|src.c:101586 : 12 hits, %0 failures -ReSign|src.c:77822 : 12 hits, %0 failures -ReSign|src.c:108657 : 12 hits, %0 failures -ReSign|src.c:108670 : 12 hits, %0 failures -ReSign|src.c:56356 : 11 hits, %0 failures -ReSign|src.c:35102 : 11 hits, %0 failures -ReSign|src.c:35117 : 11 hits, %0 failures -UnSign|src.c:58152 : 11 hits, %0 failures -ReSign|src.c:73358 : 11 hits, %0 failures -ReSign|src.c:73341 : 11 hits, %0 failures -UnSign|src.c:109577 : 10 hits, %0 failures -ReSign|src.c:109622 : 10 hits, %0 failures -UnSign|src.c:109626 : 10 hits, %0 failures -ReSign|src.c:78219 : 10 hits, %0 failures -ReSign|src.c:107299 : 10 hits, %0 failures -UnSign|src.c:101339 : 10 hits, %0 failures -ReSign|src.c:101341 : 10 hits, %0 failures -ReSign|src.c:47910 : 10 hits, %0 failures -ReSign|src.c:96463 : 10 hits, %0 failures -ReSign|src.c:96491 : 10 hits, %0 failures -ReSign|src.c:96493 : 10 hits, %0 failures -ReSign|src.c:96697 : 10 hits, %0 failures -ReSign|src.c:77875 : 10 hits, %0 failures -ReSign|src.c:97519 : 10 hits, %0 failures -UnSign|src.c:56771 : 10 hits, %0 failures -ReSign|src.c:56772 : 10 hits, %0 failures -UnSign|src.c:56850 : 10 hits, %0 failures -UnSign|src.c:54284 : 10 hits, %0 failures -ReSign|src.c:101404 : 10 hits, %0 failures -ReSign|src.c:102546 : 10 hits, %0 failures -ReSign|src.c:102554 : 10 hits, %0 failures -UnSign|src.c:74555 : 10 hits, %0 failures -UnSign|src.c:74568 : 10 hits, %0 failures -UnSign|src.c:102558 : 10 hits, %0 failures -UnSign|dlmalloc.c:4284 : 10 hits, %0 failures -ReSign|src.c:51856 : 10 hits, %0 failures -UnSign|src.c:51857 : 10 hits, %0 failures -ReSign|src.c:51857 : 10 hits, %0 failures -ReSign|src.c:67110 : 10 hits, %0 failures -UnSign|dlmalloc.c:4634 : 10 hits, %0 failures -UnSign|src.c:54942 : 10 hits, %0 failures -ReSign|src.c:94004 : 10 hits, %0 failures -ReSign|src.c:94107 : 10 hits, %0 failures -ReSign|src.c:94805 : 10 hits, %0 failures -ReSign|src.c:56656 : 10 hits, %0 failures -UnSign|src.c:60608 : 10 hits, %0 failures -ReSign|src.c:14244 : 9 hits, %0 failures -UnSign|src.c:74950 : 9 hits, %0 failures -UnSign|src.c:71495 : 9 hits, %0 failures -ReSign|src.c:57240 : 9 hits, %0 failures -ReSign|src.c:57241 : 9 hits, %0 failures -ReSign|src.c:57244 : 9 hits, %0 failures -ReSign|src.c:57258 : 9 hits, %0 failures -ReSign|src.c:108531 : 9 hits, %0 failures -ReSign|src.c:35105 : 9 hits, %0 failures -ReSign|src.c:14530 : 8 hits, %0 failures -ReSign|src.c:55559 : 8 hits, %0 failures -ReSign|src.c:109536 : 8 hits, %0 failures -ReSign|src.c:109539 : 8 hits, %0 failures -ReSign|src.c:78114 : 8 hits, %0 failures -ReSign|src.c:78115 : 8 hits, %0 failures -ReSign|src.c:78121 : 8 hits, %0 failures -ReSign|src.c:78125 : 8 hits, %0 failures -ReSign|src.c:78126 : 8 hits, %0 failures -ReSign|src.c:78129 : 8 hits, %0 failures -ReSign|src.c:78138 : 8 hits, %0 failures -ReSign|src.c:78145 : 8 hits, %0 failures -ReSign|src.c:78164 : 8 hits, %0 failures -UnSign|src.c:89689 : 8 hits, %0 failures -ReSign|src.c:89690 : 8 hits, %0 failures -ReSign|src.c:89696 : 8 hits, %0 failures -ReSign|src.c:89697 : 8 hits, %0 failures -ReSign|src.c:21096 : 8 hits, %0 failures -ReSign|src.c:78166 : 8 hits, %0 failures -ReSign|src.c:78170 : 8 hits, %0 failures -ReSign|src.c:78179 : 8 hits, %0 failures -ReSign|src.c:78186 : 8 hits, %0 failures -ReSign|src.c:78328 : 8 hits, %0 failures -UnSign|src.c:78824 : 8 hits, %0 failures -ReSign|src.c:78828 : 8 hits, %0 failures -ReSign|src.c:78837 : 8 hits, %0 failures -ReSign|src.c:78862 : 8 hits, %0 failures -ReSign|src.c:78872 : 8 hits, %0 failures -ReSign|src.c:78988 : 8 hits, %0 failures -ReSign|src.c:89717 : 8 hits, %0 failures -ReSign|src.c:60880 : 8 hits, %0 failures -ReSign|src.c:60890 : 8 hits, %0 failures -ReSign|src.c:59914 : 8 hits, %0 failures -ReSign|src.c:72565 : 8 hits, %0 failures -ReSign|src.c:72566 : 8 hits, %0 failures -ReSign|src.c:101361 : 8 hits, %0 failures -UnSign|src.c:77433 : 8 hits, %0 failures -ReSign|src.c:85002 : 8 hits, %0 failures -ReSign|src.c:77844 : 8 hits, %0 failures -ReSign|src.c:97447 : 8 hits, %0 failures -ReSign|src.c:97520 : 8 hits, %0 failures -ReSign|src.c:54869 : 8 hits, %0 failures -ReSign|src.c:54872 : 8 hits, %0 failures -ReSign|src.c:65726 : 8 hits, %0 failures -ReSign|src.c:65734 : 8 hits, %0 failures -ReSign|src.c:34760 : 8 hits, %0 failures -ReSign|dlmalloc.c:4652 : 8 hits, %0 failures -ReSign|src.c:71760 : 8 hits, %0 failures -ReSign|src.c:70550 : 8 hits, %0 failures -ReSign|src.c:70565 : 8 hits, %0 failures -ReSign|src.c:70573 : 8 hits, %0 failures -UnSign|src.c:70573 : 8 hits, %0 failures -ReSign|src.c:70576 : 8 hits, %0 failures -ReSign|src.c:70578 : 8 hits, %0 failures -ReSign|src.c:70593 : 8 hits, %0 failures -ReSign|src.c:70596 : 8 hits, %0 failures -ReSign|src.c:70601 : 8 hits, %0 failures -ReSign|src.c:70605 : 8 hits, %0 failures -ReSign|src.c:70607 : 8 hits, %0 failures -UnSign|src.c:101337 : 8 hits, %0 failures -UnSign|src.c:79782 : 8 hits, %0 failures -ReSign|src.c:79782 : 8 hits, %0 failures -ReSign|src.c:79809 : 8 hits, %0 failures -ReSign|src.c:76981 : 8 hits, %0 failures -ReSign|src.c:79824 : 8 hits, %0 failures -ReSign|src.c:79903 : 8 hits, %0 failures -ReSign|src.c:80000 : 8 hits, %0 failures -ReSign|src.c:80036 : 8 hits, %0 failures -ReSign|src.c:82203 : 8 hits, %0 failures -ReSign|src.c:101268 : 8 hits, %0 failures -ReSign|src.c:77794 : 8 hits, %0 failures -ReSign|src.c:81533 : 8 hits, %0 failures -UnSign|src.c:81545 : 8 hits, %0 failures -ReSign|src.c:81545 : 8 hits, %0 failures -ReSign|src.c:77808 : 8 hits, %0 failures -ReSign|src.c:108701 : 8 hits, %0 failures -ReSign|src.c:14557 : 7 hits, %0 failures -ReSign|2639 : 7 hits, %0 failures -ReSign|src.c:94412 : 7 hits, %0 failures -ReSign|src.c:50121 : 7 hits, %0 failures -ReSign|src.c:50124 : 7 hits, %0 failures -UnSign|src.c:50124 : 7 hits, %0 failures -ReSign|src.c:109445 : 7 hits, %0 failures -ReSign|src.c:42020 : 7 hits, %0 failures -UnSign|src.c:42024 : 7 hits, %0 failures -ReSign|src.c:42024 : 7 hits, %0 failures -ReSign|src.c:42027 : 7 hits, %0 failures -ReSign|src.c:42057 : 7 hits, %0 failures -ReSign|src.c:50125 : 7 hits, %0 failures -UnSign|src.c:49990 : 7 hits, %0 failures -ReSign|src.c:41945 : 7 hits, %0 failures -UnSign|src.c:41947 : 7 hits, %0 failures -ReSign|src.c:34392 : 7 hits, %0 failures -ReSign|src.c:41949 : 7 hits, %0 failures -ReSign|src.c:41954 : 7 hits, %0 failures -UnSign|src.c:41955 : 7 hits, %0 failures -ReSign|src.c:41955 : 7 hits, %0 failures -ReSign|src.c:41979 : 7 hits, %0 failures -ReSign|src.c:38055 : 7 hits, %0 failures -UnSign|src.c:38183 : 7 hits, %0 failures -ReSign|src.c:38183 : 7 hits, %0 failures -ReSign|src.c:41989 : 7 hits, %0 failures -ReSign|src.c:42126 : 7 hits, %0 failures -ReSign|src.c:50158 : 7 hits, %0 failures -UnSign|src.c:50158 : 7 hits, %0 failures -UnSign|src.c:73223 : 7 hits, %0 failures -ReSign|src.c:73223 : 7 hits, %0 failures -UnSign|src.c:73224 : 7 hits, %0 failures -ReSign|src.c:59324 : 7 hits, %0 failures -ReSign|src.c:42490 : 7 hits, %0 failures -ReSign|src.c:40452 : 7 hits, %0 failures -ReSign|src.c:50632 : 7 hits, %0 failures -ReSign|src.c:42537 : 7 hits, %0 failures -UnSign|src.c:42543 : 7 hits, %0 failures -ReSign|src.c:42543 : 7 hits, %0 failures -ReSign|src.c:42545 : 7 hits, %0 failures -ReSign|src.c:42732 : 7 hits, %0 failures -UnSign|src.c:42751 : 7 hits, %0 failures -ReSign|src.c:42751 : 7 hits, %0 failures -UnSign|src.c:42761 : 7 hits, %0 failures -UnSign|src.c:38708 : 7 hits, %0 failures -ReSign|src.c:38708 : 7 hits, %0 failures -ReSign|src.c:38714 : 7 hits, %0 failures -ReSign|src.c:38718 : 7 hits, %0 failures -ReSign|src.c:34549 : 7 hits, %0 failures -ReSign|src.c:38767 : 7 hits, %0 failures -ReSign|src.c:38775 : 7 hits, %0 failures -ReSign|src.c:38784 : 7 hits, %0 failures -ReSign|src.c:50724 : 7 hits, %0 failures -ReSign|dlmalloc.c:4661 : 7 hits, %0 failures -UnSign|src.c:48976 : 7 hits, %0 failures -ReSign|src.c:48976 : 7 hits, %0 failures -UnSign|src.c:71206 : 7 hits, %0 failures -UnSign|src.c:71048 : 7 hits, %0 failures -ReSign|src.c:94448 : 7 hits, %0 failures -ReSign|src.c:94475 : 7 hits, %0 failures -UnSign|src.c:74782 : 7 hits, %100 failures -ReSign|src.c:74855 : 7 hits, %0 failures -ReSign|src.c:80359 : 7 hits, %0 failures -ReSign|src.c:74870 : 7 hits, %0 failures -ReSign|src.c:74877 : 7 hits, %0 failures -UnSign|src.c:74879 : 7 hits, %0 failures -ReSign|src.c:74879 : 7 hits, %0 failures -ReSign|src.c:94479 : 7 hits, %0 failures -ReSign|src.c:94487 : 7 hits, %0 failures -ReSign|src.c:94492 : 7 hits, %0 failures -ReSign|src.c:94699 : 7 hits, %0 failures -ReSign|src.c:73760 : 7 hits, %0 failures -ReSign|src.c:73764 : 7 hits, %0 failures -ReSign|src.c:74329 : 7 hits, %0 failures -ReSign|src.c:57147 : 7 hits, %0 failures -UnSign|src.c:57990 : 7 hits, %0 failures -UnSign|src.c:101413 : 7 hits, %0 failures -ReSign|src.c:101413 : 7 hits, %0 failures -UnSign|src.c:98935 : 7 hits, %0 failures -ReSign|src.c:71406 : 7 hits, %0 failures -ReSign|src.c:71424 : 7 hits, %0 failures -UnSign|src.c:71430 : 7 hits, %0 failures -ReSign|src.c:98943 : 7 hits, %0 failures -ReSign|src.c:102248 : 7 hits, %0 failures -ReSign|src.c:108076 : 6 hits, %0 failures -ReSign|src.c:108087 : 6 hits, %0 failures -ReSign|src.c:108090 : 6 hits, %0 failures -ReSign|src.c:108092 : 6 hits, %0 failures -ReSign|src.c:108100 : 6 hits, %0 failures -ReSign|src.c:108108 : 6 hits, %0 failures -ReSign|src.c:108152 : 6 hits, %0 failures -ReSign|src.c:14537 : 6 hits, %0 failures -ReSign|src.c:81275 : 6 hits, %0 failures -ReSign|src.c:81292 : 6 hits, %0 failures -ReSign|src.c:49238 : 6 hits, %0 failures -ReSign|src.c:40287 : 6 hits, %0 failures -ReSign|src.c:40314 : 6 hits, %0 failures -ReSign|src.c:78994 : 6 hits, %0 failures -ReSign|src.c:79004 : 6 hits, %0 failures -ReSign|src.c:79008 : 6 hits, %0 failures -ReSign|src.c:20355 : 6 hits, %0 failures -UnSign|src.c:70667 : 6 hits, %0 failures -ReSign|src.c:70667 : 6 hits, %0 failures -ReSign|src.c:70928 : 6 hits, %0 failures -UnSign|src.c:72451 : 6 hits, %0 failures -ReSign|src.c:72451 : 6 hits, %0 failures -UnSign|src.c:72455 : 6 hits, %0 failures -ReSign|src.c:70936 : 6 hits, %0 failures -ReSign|src.c:70950 : 6 hits, %0 failures -UnSign|src.c:70871 : 6 hits, %0 failures -ReSign|src.c:70881 : 6 hits, %0 failures -ReSign|src.c:74723 : 6 hits, %0 failures -ReSign|src.c:91245 : 6 hits, %0 failures -ReSign|src.c:91253 : 6 hits, %0 failures -UnSign|src.c:101248 : 6 hits, %0 failures -UnSign|src.c:99813 : 6 hits, %0 failures -ReSign|src.c:99819 : 6 hits, %0 failures -ReSign|src.c:99822 : 6 hits, %0 failures -UnSign|src.c:99854 : 6 hits, %0 failures -ReSign|src.c:99877 : 6 hits, %0 failures -UnSign|src.c:99877 : 6 hits, %0 failures -ReSign|src.c:101250 : 6 hits, %0 failures -ReSign|src.c:101254 : 6 hits, %0 failures -ReSign|src.c:102070 : 6 hits, %0 failures -ReSign|src.c:102075 : 6 hits, %0 failures -ReSign|src.c:102103 : 6 hits, %0 failures -ReSign|src.c:102105 : 6 hits, %0 failures -ReSign|src.c:102121 : 6 hits, %0 failures -ReSign|src.c:102129 : 6 hits, %0 failures -ReSign|src.c:58240 : 6 hits, %0 failures -ReSign|src.c:58244 : 6 hits, %0 failures -ReSign|src.c:19186 : 6 hits, %0 failures -ReSign|src.c:107350 : 6 hits, %0 failures -UnSign|src.c:105971 : 6 hits, %0 failures -ReSign|src.c:105971 : 6 hits, %0 failures -ReSign|src.c:105976 : 6 hits, %0 failures -ReSign|src.c:18672 : 6 hits, %0 failures -UnSign|src.c:18673 : 6 hits, %0 failures -ReSign|src.c:96551 : 6 hits, %0 failures -ReSign|src.c:66496 : 6 hits, %0 failures -UnSign|src.c:52010 : 6 hits, %0 failures -ReSign|src.c:66501 : 6 hits, %0 failures -ReSign|src.c:66505 : 6 hits, %0 failures -ReSign|src.c:108532 : 6 hits, %0 failures -ReSign|src.c:42145 : 6 hits, %0 failures -UnSign|src.c:42166 : 6 hits, %0 failures -ReSign|src.c:42169 : 6 hits, %0 failures -ReSign|src.c:42171 : 6 hits, %0 failures -ReSign|src.c:42173 : 6 hits, %0 failures -ReSign|src.c:34441 : 6 hits, %0 failures -UnSign|src.c:34445 : 6 hits, %0 failures -UnSign|src.c:34454 : 6 hits, %0 failures -ReSign|src.c:42189 : 6 hits, %0 failures -ReSign|src.c:54026 : 6 hits, %0 failures -ReSign|src.c:53295 : 6 hits, %0 failures -UnSign|src.c:53299 : 6 hits, %0 failures -ReSign|src.c:53300 : 6 hits, %0 failures -ReSign|src.c:48927 : 6 hits, %0 failures -ReSign|src.c:53321 : 6 hits, %0 failures -ReSign|src.c:53329 : 6 hits, %0 failures -ReSign|src.c:54029 : 6 hits, %0 failures -ReSign|src.c:54033 : 6 hits, %0 failures -UnSign|src.c:54045 : 6 hits, %0 failures -UnSign|src.c:54049 : 6 hits, %0 failures -UnSign|src.c:54050 : 6 hits, %0 failures -ReSign|src.c:54088 : 6 hits, %0 failures -ReSign|src.c:102136 : 6 hits, %0 failures -ReSign|src.c:101414 : 6 hits, %0 failures -ReSign|src.c:71539 : 6 hits, %0 failures -ReSign|src.c:98811 : 6 hits, %0 failures -ReSign|src.c:74982 : 6 hits, %0 failures -ReSign|src.c:73845 : 6 hits, %0 failures -ReSign|src.c:79998 : 6 hits, %0 failures -ReSign|src.c:80027 : 6 hits, %0 failures -UnSign|src.c:78635 : 6 hits, %0 failures -ReSign|src.c:80191 : 6 hits, %0 failures -ReSign|src.c:101744 : 6 hits, %0 failures -UnSign|src.c:72489 : 6 hits, %100 failures -ReSign|src.c:72489 : 6 hits, %0 failures -ReSign|src.c:72533 : 6 hits, %0 failures -UnSign|src.c:72534 : 6 hits, %100 failures -ReSign|src.c:72534 : 6 hits, %0 failures -ReSign|src.c:72539 : 6 hits, %0 failures -ReSign|src.c:108659 : 6 hits, %0 failures -ReSign|src.c:128473 : 6 hits, %0 failures -UnSign|src.c:31200 : 5 hits, %0 failures -UnSign|src.c:35659 : 5 hits, %0 failures -ReSign|src.c:35664 : 5 hits, %0 failures -ReSign|src.c:35666 : 5 hits, %0 failures -ReSign|src.c:35668 : 5 hits, %0 failures -ReSign|src.c:35685 : 5 hits, %0 failures -ReSign|src.c:36007 : 5 hits, %0 failures -UnSign|src.c:101550 : 5 hits, %0 failures -UnSign|src.c:101554 : 5 hits, %0 failures -ReSign|src.c:101555 : 5 hits, %0 failures -ReSign|src.c:93548 : 5 hits, %0 failures -UnSign|src.c:93550 : 5 hits, %100 failures -ReSign|src.c:93550 : 5 hits, %0 failures -UnSign|src.c:93551 : 5 hits, %0 failures -ReSign|src.c:93551 : 5 hits, %0 failures -ReSign|src.c:93553 : 5 hits, %0 failures -ReSign|src.c:94784 : 5 hits, %0 failures -ReSign|src.c:94001 : 5 hits, %0 failures -ReSign|src.c:94009 : 5 hits, %0 failures -UnSign|src.c:94799 : 5 hits, %0 failures -ReSign|src.c:94800 : 5 hits, %0 failures -ReSign|src.c:94059 : 5 hits, %0 failures -ReSign|src.c:94067 : 5 hits, %0 failures -UnSign|src.c:94072 : 5 hits, %0 failures -ReSign|src.c:94072 : 5 hits, %0 failures -ReSign|src.c:94090 : 5 hits, %0 failures -UnSign|src.c:94805 : 5 hits, %0 failures -ReSign|src.c:94036 : 5 hits, %0 failures -ReSign|src.c:61388 : 5 hits, %0 failures -ReSign|src.c:61396 : 5 hits, %0 failures -ReSign|src.c:83547 : 5 hits, %0 failures -ReSign|src.c:68133 : 5 hits, %0 failures -UnSign|src.c:68136 : 5 hits, %0 failures -ReSign|src.c:68138 : 5 hits, %0 failures -ReSign|src.c:99042 : 5 hits, %0 failures -UnSign|src.c:60606 : 5 hits, %0 failures -ReSign|src.c:60606 : 5 hits, %0 failures -ReSign|src.c:128475 : 5 hits, %0 failures -ReSign|src.c:75243 : 4 hits, %0 failures -ReSign|src.c:31201 : 4 hits, %0 failures -UnSign|src.c:31201 : 4 hits, %0 failures -ReSign|src.c:14552 : 4 hits, %0 failures -ReSign|src.c:14528 : 4 hits, %0 failures -ReSign|src.c:14532 : 4 hits, %0 failures -ReSign|src.c:109775 : 4 hits, %0 failures -ReSign|src.c:49267 : 4 hits, %0 failures -ReSign|src.c:41117 : 4 hits, %0 failures -UnSign|src.c:40287 : 4 hits, %0 failures -ReSign|src.c:40294 : 4 hits, %0 failures -UnSign|src.c:40304 : 4 hits, %0 failures -ReSign|src.c:40313 : 4 hits, %0 failures -ReSign|src.c:41302 : 4 hits, %0 failures -UnSign|src.c:49372 : 4 hits, %0 failures -ReSign|src.c:49383 : 4 hits, %0 failures -ReSign|src.c:35261 : 4 hits, %0 failures -ReSign|src.c:81557 : 4 hits, %0 failures -ReSign|src.c:81562 : 4 hits, %0 failures -UnSign|src.c:81564 : 4 hits, %0 failures -ReSign|src.c:81564 : 4 hits, %0 failures -ReSign|src.c:108612 : 4 hits, %0 failures -UnSign|src.c:109539 : 4 hits, %0 failures -ReSign|src.c:108412 : 4 hits, %0 failures -UnSign|src.c:78055 : 4 hits, %0 failures -ReSign|src.c:78057 : 4 hits, %0 failures -ReSign|src.c:89811 : 4 hits, %0 failures -ReSign|src.c:89816 : 4 hits, %0 failures -ReSign|src.c:89828 : 4 hits, %0 failures -ReSign|src.c:89833 : 4 hits, %0 failures -UnSign|src.c:89834 : 4 hits, %0 failures -ReSign|src.c:89840 : 4 hits, %0 failures -UnSign|src.c:55527 : 4 hits, %0 failures -ReSign|src.c:35880 : 4 hits, %0 failures -ReSign|src.c:89937 : 4 hits, %0 failures -ReSign|src.c:89996 : 4 hits, %0 failures -ReSign|src.c:78258 : 4 hits, %0 failures -ReSign|src.c:19105 : 4 hits, %0 failures -ReSign|src.c:19106 : 4 hits, %0 failures -ReSign|src.c:19108 : 4 hits, %0 failures -ReSign|src.c:19109 : 4 hits, %0 failures -ReSign|src.c:77596 : 4 hits, %0 failures -ReSign|src.c:77601 : 4 hits, %0 failures -ReSign|src.c:18677 : 4 hits, %0 failures -UnSign|src.c:18678 : 4 hits, %0 failures -ReSign|src.c:96402 : 4 hits, %0 failures -ReSign|src.c:96547 : 4 hits, %0 failures -ReSign|src.c:77433 : 4 hits, %0 failures -ReSign|src.c:96659 : 4 hits, %0 failures -ReSign|src.c:96760 : 4 hits, %0 failures -ReSign|src.c:85148 : 4 hits, %0 failures -ReSign|src.c:65730 : 4 hits, %0 failures -UnSign|src.c:67504 : 4 hits, %0 failures -ReSign|src.c:67504 : 4 hits, %0 failures -ReSign|src.c:54483 : 4 hits, %0 failures -ReSign|src.c:54586 : 4 hits, %0 failures -ReSign|src.c:54590 : 4 hits, %0 failures -ReSign|src.c:52013 : 4 hits, %0 failures -ReSign|src.c:52068 : 4 hits, %0 failures -ReSign|src.c:67545 : 4 hits, %0 failures -ReSign|src.c:67552 : 4 hits, %0 failures -ReSign|src.c:67560 : 4 hits, %0 failures -ReSign|src.c:67565 : 4 hits, %0 failures -ReSign|src.c:65554 : 4 hits, %0 failures -ReSign|src.c:65561 : 4 hits, %0 failures -ReSign|src.c:108594 : 4 hits, %0 failures -ReSign|src.c:100108 : 4 hits, %0 failures -UnSign|src.c:100115 : 4 hits, %0 failures -ReSign|src.c:102377 : 4 hits, %0 failures -UnSign|src.c:102529 : 4 hits, %0 failures -ReSign|src.c:73846 : 4 hits, %0 failures -UnSign|src.c:106257 : 4 hits, %0 failures -ReSign|src.c:106264 : 4 hits, %0 failures -ReSign|src.c:79785 : 4 hits, %0 failures -ReSign|src.c:79792 : 4 hits, %0 failures -ReSign|src.c:79800 : 4 hits, %0 failures -ReSign|src.c:79807 : 4 hits, %0 failures -ReSign|src.c:79815 : 4 hits, %0 failures -ReSign|src.c:77013 : 4 hits, %0 failures -ReSign|src.c:77016 : 4 hits, %0 failures -ReSign|src.c:77036 : 4 hits, %0 failures -ReSign|src.c:77025 : 4 hits, %0 failures -ReSign|src.c:77057 : 4 hits, %0 failures -ReSign|src.c:77026 : 4 hits, %0 failures -ReSign|src.c:79816 : 4 hits, %0 failures -UnSign|src.c:79824 : 4 hits, %0 failures -ReSign|src.c:79836 : 4 hits, %0 failures -ReSign|src.c:79842 : 4 hits, %0 failures -UnSign|src.c:79848 : 4 hits, %0 failures -ReSign|src.c:79848 : 4 hits, %0 failures -ReSign|src.c:79867 : 4 hits, %0 failures -ReSign|src.c:79869 : 4 hits, %0 failures -ReSign|src.c:79870 : 4 hits, %0 failures -ReSign|src.c:79873 : 4 hits, %0 failures -ReSign|src.c:79879 : 4 hits, %0 failures -ReSign|src.c:79907 : 4 hits, %0 failures -ReSign|src.c:79908 : 4 hits, %0 failures -ReSign|src.c:79918 : 4 hits, %0 failures -ReSign|src.c:79932 : 4 hits, %0 failures -ReSign|src.c:79956 : 4 hits, %0 failures -ReSign|src.c:79969 : 4 hits, %0 failures -UnSign|src.c:79969 : 4 hits, %0 failures -UnSign|src.c:79975 : 4 hits, %0 failures -ReSign|src.c:79975 : 4 hits, %0 failures -ReSign|src.c:80012 : 4 hits, %0 failures -ReSign|src.c:80023 : 4 hits, %0 failures -UnSign|src.c:80031 : 4 hits, %0 failures -UnSign|src.c:80244 : 4 hits, %0 failures -UnSign|src.c:80248 : 4 hits, %0 failures -UnSign|src.c:80250 : 4 hits, %0 failures -ReSign|src.c:80250 : 4 hits, %0 failures -ReSign|src.c:80099 : 4 hits, %0 failures -ReSign|src.c:81095 : 4 hits, %0 failures -ReSign|src.c:81108 : 4 hits, %0 failures -ReSign|src.c:82205 : 4 hits, %0 failures -ReSign|src.c:82214 : 4 hits, %0 failures -ReSign|src.c:85093 : 4 hits, %0 failures -ReSign|src.c:85106 : 4 hits, %0 failures -UnSign|src.c:80191 : 4 hits, %0 failures -ReSign|src.c:80210 : 4 hits, %0 failures -UnSign|src.c:65909 : 4 hits, %0 failures -ReSign|src.c:48978 : 4 hits, %0 failures -UnSign|src.c:48982 : 4 hits, %0 failures -UnSign|src.c:48983 : 4 hits, %0 failures -ReSign|src.c:60763 : 4 hits, %0 failures -UnSign|src.c:102331 : 4 hits, %0 failures -ReSign|src.c:102337 : 4 hits, %0 failures -ReSign|src.c:77770 : 4 hits, %0 failures -UnSign|src.c:81547 : 4 hits, %0 failures -ReSign|src.c:108672 : 4 hits, %0 failures -ReSign|src.c:35750 : 4 hits, %0 failures -ReSign|src.c:49579 : 4 hits, %0 failures -ReSign|src.c:108693 : 4 hits, %0 failures -ReSign|src.c:87939 : 4 hits, %0 failures -ReSign|src.c:14509 : 3 hits, %0 failures -ReSign|src.c:14515 : 3 hits, %0 failures -ReSign|src.c:14516 : 3 hits, %0 failures -UnSign|src.c:101196 : 3 hits, %0 failures -ReSign|src.c:101196 : 3 hits, %0 failures -UnSign|src.c:101207 : 3 hits, %0 failures -ReSign|src.c:101207 : 3 hits, %0 failures -UnSign|src.c:101235 : 3 hits, %0 failures -ReSign|src.c:101235 : 3 hits, %0 failures -UnSign|src.c:101626 : 3 hits, %0 failures -ReSign|src.c:101626 : 3 hits, %0 failures -ReSign|src.c:65541 : 3 hits, %0 failures -ReSign|src.c:65546 : 3 hits, %0 failures -ReSign|src.c:74260 : 3 hits, %0 failures -ReSign|src.c:99016 : 3 hits, %0 failures -ReSign|src.c:57547 : 3 hits, %0 failures -UnSign|src.c:48984 : 3 hits, %0 failures -ReSign|src.c:48984 : 3 hits, %0 failures -UnSign|src.c:72491 : 3 hits, %100 failures -ReSign|src.c:72491 : 3 hits, %0 failures -UnSign|src.c:72492 : 3 hits, %0 failures -ReSign|src.c:72516 : 3 hits, %0 failures -UnSign|src.c:72536 : 3 hits, %100 failures -ReSign|src.c:72536 : 3 hits, %0 failures -UnSign|src.c:72537 : 3 hits, %0 failures -UnSign|src.c:72539 : 3 hits, %0 failures -ReSign|src.c:102256 : 3 hits, %0 failures -UnSign|src.c:102256 : 3 hits, %0 failures -ReSign|src.c:102257 : 3 hits, %0 failures -UnSign|src.c:102257 : 3 hits, %0 failures -ReSign|src.c:102258 : 3 hits, %0 failures -ReSign|src.c:101577 : 3 hits, %0 failures -ReSign|src.c:101591 : 3 hits, %0 failures -ReSign|src.c:101596 : 3 hits, %0 failures -ReSign|src.c:102331 : 3 hits, %0 failures -ReSign|src.c:66228 : 3 hits, %0 failures -ReSign|src.c:100866 : 3 hits, %0 failures -ReSign|src.c:108226 : 2 hits, %0 failures -ReSign|src.c:108095 : 2 hits, %0 failures -ReSign|dlmalloc.c:2982 : 2 hits, %0 failures -ReSign|dlmalloc.c:3919 : 2 hits, %0 failures -ReSign|dlmalloc.c:4009 : 2 hits, %0 failures -ReSign|src.c:35465 : 2 hits, %0 failures -ReSign|src.c:109984 : 2 hits, %0 failures -ReSign|src.c:110003 : 2 hits, %0 failures -ReSign|src.c:110005 : 2 hits, %0 failures -ReSign|src.c:110007 : 2 hits, %0 failures -ReSign|src.c:110009 : 2 hits, %0 failures -ReSign|src.c:110014 : 2 hits, %0 failures -ReSign|src.c:110016 : 2 hits, %0 failures -ReSign|src.c:110045 : 2 hits, %0 failures -ReSign|src.c:110046 : 2 hits, %0 failures -ReSign|src.c:57405 : 2 hits, %0 failures -ReSign|src.c:110096 : 2 hits, %0 failures -ReSign|src.c:109942 : 2 hits, %0 failures -ReSign|src.c:109949 : 2 hits, %0 failures -ReSign|src.c:109954 : 2 hits, %0 failures -ReSign|src.c:110109 : 2 hits, %0 failures -UnSign|src.c:49238 : 2 hits, %0 failures -ReSign|src.c:49247 : 2 hits, %0 failures -ReSign|src.c:49246 : 2 hits, %0 failures -UnSign|src.c:49247 : 2 hits, %0 failures -ReSign|src.c:49261 : 2 hits, %0 failures -ReSign|src.c:49264 : 2 hits, %0 failures -ReSign|src.c:49271 : 2 hits, %0 failures -ReSign|src.c:49286 : 2 hits, %0 failures -ReSign|src.c:49336 : 2 hits, %0 failures -ReSign|src.c:49349 : 2 hits, %0 failures -ReSign|src.c:41102 : 2 hits, %0 failures -UnSign|src.c:41102 : 2 hits, %0 failures -ReSign|src.c:41103 : 2 hits, %0 failures -UnSign|src.c:41103 : 2 hits, %0 failures -ReSign|src.c:41127 : 2 hits, %0 failures -ReSign|src.c:41137 : 2 hits, %0 failures -ReSign|src.c:41192 : 2 hits, %0 failures -ReSign|src.c:41205 : 2 hits, %0 failures -ReSign|src.c:41226 : 2 hits, %0 failures -ReSign|src.c:41283 : 2 hits, %0 failures -UnSign|src.c:40294 : 2 hits, %0 failures -ReSign|src.c:40297 : 2 hits, %0 failures -ReSign|src.c:40299 : 2 hits, %0 failures -ReSign|src.c:40302 : 2 hits, %0 failures -ReSign|src.c:34877 : 2 hits, %0 failures -ReSign|src.c:41292 : 2 hits, %0 failures -UnSign|src.c:41302 : 2 hits, %0 failures -ReSign|src.c:41309 : 2 hits, %0 failures -UnSign|src.c:41332 : 2 hits, %0 failures -ReSign|src.c:41332 : 2 hits, %0 failures -UnSign|src.c:41333 : 2 hits, %0 failures -ReSign|src.c:41333 : 2 hits, %0 failures -ReSign|src.c:39325 : 2 hits, %0 failures -UnSign|src.c:39332 : 2 hits, %0 failures -UnSign|src.c:39335 : 2 hits, %0 failures -ReSign|src.c:41342 : 2 hits, %0 failures -ReSign|src.c:41344 : 2 hits, %0 failures -ReSign|src.c:49355 : 2 hits, %0 failures -ReSign|src.c:40399 : 2 hits, %0 failures -ReSign|src.c:49358 : 2 hits, %0 failures -UnSign|src.c:49373 : 2 hits, %0 failures -UnSign|src.c:49397 : 2 hits, %0 failures -ReSign|src.c:49398 : 2 hits, %0 failures -UnSign|src.c:49399 : 2 hits, %0 failures -ReSign|src.c:49405 : 2 hits, %0 failures -ReSign|src.c:49430 : 2 hits, %0 failures -ReSign|src.c:49459 : 2 hits, %0 failures -ReSign|src.c:49471 : 2 hits, %0 failures -ReSign|src.c:49475 : 2 hits, %0 failures -ReSign|src.c:110119 : 2 hits, %0 failures -ReSign|src.c:110139 : 2 hits, %0 failures -ReSign|src.c:109150 : 2 hits, %0 failures -ReSign|src.c:108981 : 2 hits, %0 failures -ReSign|src.c:108993 : 2 hits, %0 failures -ReSign|src.c:108995 : 2 hits, %0 failures -ReSign|src.c:109018 : 2 hits, %0 failures -ReSign|src.c:81500 : 2 hits, %0 failures -ReSign|src.c:109031 : 2 hits, %0 failures -ReSign|src.c:109039 : 2 hits, %0 failures -ReSign|src.c:83657 : 2 hits, %0 failures -ReSign|src.c:88073 : 2 hits, %0 failures -ReSign|src.c:110155 : 2 hits, %0 failures -ReSign|src.c:108397 : 2 hits, %0 failures -ReSign|src.c:108404 : 2 hits, %0 failures -ReSign|src.c:108410 : 2 hits, %0 failures -ReSign|src.c:108411 : 2 hits, %0 failures -ReSign|src.c:108415 : 2 hits, %0 failures -ReSign|src.c:108427 : 2 hits, %0 failures -ReSign|src.c:108439 : 2 hits, %0 failures -ReSign|src.c:109294 : 2 hits, %0 failures -ReSign|src.c:110211 : 2 hits, %0 failures -ReSign|src.c:110216 : 2 hits, %0 failures -ReSign|src.c:110219 : 2 hits, %0 failures -ReSign|src.c:55527 : 2 hits, %0 failures -ReSign|src.c:89851 : 2 hits, %0 failures -ReSign|src.c:35851 : 2 hits, %0 failures -ReSign|src.c:35861 : 2 hits, %0 failures -ReSign|src.c:35862 : 2 hits, %0 failures -ReSign|src.c:34909 : 2 hits, %0 failures -ReSign|src.c:89853 : 2 hits, %0 failures -ReSign|src.c:89887 : 2 hits, %0 failures -UnSign|src.c:89905 : 2 hits, %0 failures -ReSign|src.c:89909 : 2 hits, %0 failures -ReSign|src.c:21671 : 2 hits, %0 failures -ReSign|src.c:89911 : 2 hits, %0 failures -UnSign|src.c:89923 : 2 hits, %0 failures -ReSign|src.c:89923 : 2 hits, %0 failures -UnSign|src.c:89926 : 2 hits, %0 failures -ReSign|src.c:89926 : 2 hits, %0 failures -ReSign|src.c:89960 : 2 hits, %0 failures -ReSign|src.c:89963 : 2 hits, %0 failures -ReSign|src.c:76440 : 2 hits, %0 failures -ReSign|src.c:76450 : 2 hits, %0 failures -ReSign|src.c:89968 : 2 hits, %0 failures -ReSign|src.c:89972 : 2 hits, %0 failures -UnSign|src.c:89981 : 2 hits, %0 failures -ReSign|src.c:89990 : 2 hits, %0 failures -ReSign|src.c:50743 : 2 hits, %0 failures -ReSign|src.c:90022 : 2 hits, %0 failures -UnSign|src.c:78115 : 2 hits, %0 failures -ReSign|src.c:89841 : 2 hits, %0 failures -UnSign|src.c:89842 : 2 hits, %0 failures -ReSign|src.c:90035 : 2 hits, %0 failures -ReSign|src.c:78226 : 2 hits, %0 failures -ReSign|src.c:78240 : 2 hits, %0 failures -UnSign|src.c:78244 : 2 hits, %0 failures -ReSign|src.c:77957 : 2 hits, %0 failures -ReSign|src.c:77960 : 2 hits, %0 failures -ReSign|src.c:78880 : 2 hits, %0 failures -ReSign|src.c:78887 : 2 hits, %0 failures -ReSign|src.c:78912 : 2 hits, %0 failures -ReSign|src.c:78936 : 2 hits, %0 failures -ReSign|src.c:78949 : 2 hits, %0 failures -UnSign|src.c:105889 : 2 hits, %0 failures -UnSign|src.c:96402 : 2 hits, %0 failures -ReSign|src.c:96410 : 2 hits, %0 failures -ReSign|src.c:96418 : 2 hits, %0 failures -UnSign|src.c:96418 : 2 hits, %0 failures -ReSign|src.c:96430 : 2 hits, %0 failures -ReSign|src.c:96433 : 2 hits, %0 failures -ReSign|src.c:96437 : 2 hits, %0 failures -ReSign|src.c:96446 : 2 hits, %0 failures -ReSign|src.c:84715 : 2 hits, %0 failures -ReSign|src.c:96507 : 2 hits, %0 failures -ReSign|src.c:96508 : 2 hits, %0 failures -ReSign|src.c:96512 : 2 hits, %0 failures -ReSign|src.c:96530 : 2 hits, %0 failures -UnSign|src.c:96531 : 2 hits, %0 failures -ReSign|src.c:96531 : 2 hits, %0 failures -UnSign|src.c:96536 : 2 hits, %0 failures -ReSign|src.c:96536 : 2 hits, %0 failures -ReSign|src.c:96558 : 2 hits, %0 failures -ReSign|src.c:96566 : 2 hits, %0 failures -ReSign|src.c:96574 : 2 hits, %0 failures -ReSign|src.c:101238 : 2 hits, %0 failures -ReSign|src.c:96582 : 2 hits, %0 failures -UnSign|src.c:96583 : 2 hits, %0 failures -ReSign|src.c:96588 : 2 hits, %0 failures -ReSign|src.c:96599 : 2 hits, %0 failures -ReSign|src.c:96604 : 2 hits, %0 failures -ReSign|src.c:96611 : 2 hits, %0 failures -ReSign|src.c:96612 : 2 hits, %0 failures -ReSign|src.c:96616 : 2 hits, %0 failures -ReSign|src.c:96623 : 2 hits, %0 failures -ReSign|src.c:96634 : 2 hits, %0 failures -ReSign|src.c:96652 : 2 hits, %0 failures -ReSign|src.c:96245 : 2 hits, %0 failures -ReSign|src.c:96250 : 2 hits, %0 failures -ReSign|src.c:96716 : 2 hits, %0 failures -ReSign|src.c:96743 : 2 hits, %0 failures -ReSign|src.c:96747 : 2 hits, %0 failures -ReSign|src.c:96751 : 2 hits, %0 failures -ReSign|src.c:82169 : 2 hits, %0 failures -ReSign|src.c:96765 : 2 hits, %0 failures -ReSign|src.c:96775 : 2 hits, %0 failures -ReSign|src.c:96782 : 2 hits, %0 failures -ReSign|src.c:96191 : 2 hits, %0 failures -ReSign|src.c:96796 : 2 hits, %0 failures -UnSign|src.c:96807 : 2 hits, %0 failures -ReSign|src.c:96807 : 2 hits, %0 failures -ReSign|src.c:96816 : 2 hits, %0 failures -ReSign|src.c:77351 : 2 hits, %0 failures -UnSign|src.c:78968 : 2 hits, %0 failures -ReSign|src.c:78968 : 2 hits, %0 failures -ReSign|src.c:49997 : 2 hits, %0 failures -UnSign|src.c:50015 : 2 hits, %0 failures -UnSign|src.c:50016 : 2 hits, %0 failures -UnSign|src.c:64339 : 2 hits, %0 failures -ReSign|src.c:64339 : 2 hits, %0 failures -UnSign|src.c:64347 : 2 hits, %0 failures -ReSign|src.c:52008 : 2 hits, %0 failures -ReSign|src.c:52010 : 2 hits, %0 failures -UnSign|src.c:52068 : 2 hits, %0 failures -UnSign|src.c:64858 : 2 hits, %0 failures -ReSign|src.c:64858 : 2 hits, %0 failures -ReSign|src.c:54281 : 2 hits, %0 failures -ReSign|src.c:54285 : 2 hits, %0 failures -UnSign|src.c:52699 : 2 hits, %0 failures -ReSign|src.c:52699 : 2 hits, %0 failures -UnSign|src.c:54290 : 2 hits, %0 failures -ReSign|src.c:54291 : 2 hits, %0 failures -UnSign|src.c:65541 : 2 hits, %0 failures -UnSign|src.c:65561 : 2 hits, %0 failures -ReSign|src.c:65562 : 2 hits, %0 failures -ReSign|src.c:65566 : 2 hits, %0 failures -ReSign|src.c:65570 : 2 hits, %0 failures -ReSign|src.c:65579 : 2 hits, %0 failures -UnSign|src.c:93590 : 2 hits, %0 failures -ReSign|src.c:93590 : 2 hits, %0 failures -UnSign|src.c:93591 : 2 hits, %100 failures -ReSign|src.c:93591 : 2 hits, %0 failures -UnSign|src.c:93592 : 2 hits, %0 failures -ReSign|src.c:93592 : 2 hits, %0 failures -UnSign|src.c:93593 : 2 hits, %0 failures -ReSign|src.c:93593 : 2 hits, %0 failures -ReSign|src.c:94736 : 2 hits, %0 failures -ReSign|src.c:94741 : 2 hits, %0 failures -ReSign|src.c:94748 : 2 hits, %0 failures -UnSign|src.c:94124 : 2 hits, %0 failures -ReSign|src.c:94124 : 2 hits, %0 failures -ReSign|src.c:65345 : 2 hits, %0 failures -UnSign|src.c:107229 : 2 hits, %0 failures -ReSign|src.c:107229 : 2 hits, %0 failures -ReSign|src.c:107232 : 2 hits, %0 failures -UnSign|src.c:107214 : 2 hits, %0 failures -ReSign|src.c:107214 : 2 hits, %0 failures -ReSign|src.c:107217 : 2 hits, %0 failures -ReSign|src.c:107220 : 2 hits, %0 failures -ReSign|src.c:74261 : 2 hits, %0 failures -UnSign|src.c:74261 : 2 hits, %0 failures -ReSign|src.c:72370 : 2 hits, %0 failures -ReSign|src.c:83714 : 2 hits, %0 failures -UnSign|src.c:83726 : 2 hits, %0 failures -ReSign|src.c:73839 : 2 hits, %0 failures -UnSign|src.c:73849 : 2 hits, %0 failures -ReSign|src.c:73849 : 2 hits, %0 failures -ReSign|src.c:79874 : 2 hits, %0 failures -ReSign|src.c:80137 : 2 hits, %0 failures -ReSign|src.c:80148 : 2 hits, %0 failures -ReSign|src.c:80151 : 2 hits, %0 failures -ReSign|src.c:80163 : 2 hits, %0 failures -ReSign|src.c:80176 : 2 hits, %0 failures -ReSign|src.c:79680 : 2 hits, %0 failures -ReSign|src.c:79690 : 2 hits, %0 failures -ReSign|src.c:79691 : 2 hits, %0 failures -ReSign|src.c:79700 : 2 hits, %0 failures -ReSign|src.c:82212 : 2 hits, %0 failures -UnSign|src.c:79707 : 2 hits, %0 failures -ReSign|src.c:79707 : 2 hits, %0 failures -ReSign|src.c:65901 : 2 hits, %0 failures -UnSign|src.c:48978 : 2 hits, %0 failures -ReSign|src.c:80105 : 2 hits, %0 failures -ReSign|src.c:80111 : 2 hits, %0 failures -ReSign|src.c:80192 : 2 hits, %0 failures -ReSign|src.c:68333 : 2 hits, %0 failures -UnSign|dlmalloc.c:4661 : 2 hits, %0 failures -ReSign|src.c:101270 : 2 hits, %0 failures -ReSign|src.c:101274 : 2 hits, %0 failures -ReSign|src.c:101342 : 2 hits, %0 failures -ReSign|src.c:101354 : 2 hits, %0 failures -UnSign|src.c:102212 : 2 hits, %0 failures -ReSign|src.c:102212 : 2 hits, %0 failures -ReSign|src.c:102225 : 2 hits, %0 failures -ReSign|src.c:102229 : 2 hits, %0 failures -ReSign|src.c:101737 : 2 hits, %0 failures -ReSign|src.c:101754 : 2 hits, %0 failures -ReSign|src.c:101768 : 2 hits, %0 failures -UnSign|src.c:102258 : 2 hits, %0 failures -ReSign|src.c:102262 : 2 hits, %0 failures -UnSign|src.c:102288 : 2 hits, %0 failures -ReSign|src.c:102302 : 2 hits, %0 failures -ReSign|src.c:102335 : 2 hits, %0 failures -ReSign|src.c:102347 : 2 hits, %0 failures -ReSign|src.c:102356 : 2 hits, %0 failures -ReSign|src.c:102366 : 2 hits, %0 failures -ReSign|src.c:102368 : 2 hits, %0 failures -ReSign|src.c:58406 : 2 hits, %0 failures -ReSign|src.c:58413 : 2 hits, %0 failures -UnSign|src.c:103313 : 2 hits, %0 failures -ReSign|src.c:103313 : 2 hits, %0 failures -UnSign|src.c:103323 : 2 hits, %0 failures -ReSign|src.c:103323 : 2 hits, %0 failures -ReSign|src.c:66130 : 2 hits, %0 failures -UnSign|src.c:66131 : 2 hits, %0 failures -ReSign|src.c:66133 : 2 hits, %0 failures -UnSign|src.c:66215 : 2 hits, %0 failures -ReSign|src.c:66215 : 2 hits, %0 failures -ReSign|src.c:66217 : 2 hits, %0 failures -ReSign|src.c:66227 : 2 hits, %0 failures -ReSign|src.c:66249 : 2 hits, %0 failures -ReSign|src.c:100867 : 2 hits, %0 failures -UnSign|src.c:102248 : 2 hits, %0 failures -ReSign|src.c:102269 : 2 hits, %0 failures -ReSign|src.c:102310 : 2 hits, %0 failures -ReSign|src.c:108628 : 2 hits, %0 failures -ReSign|src.c:108631 : 2 hits, %0 failures -ReSign|src.c:77878 : 2 hits, %0 failures -ReSign|src.c:108649 : 2 hits, %0 failures -ReSign|src.c:55533 : 2 hits, %0 failures -UnSign|src.c:55533 : 2 hits, %0 failures -ReSign|src.c:49551 : 2 hits, %0 failures -ReSign|src.c:50821 : 2 hits, %0 failures -UnSign|src.c:50834 : 2 hits, %0 failures -ReSign|src.c:50834 : 2 hits, %0 failures -ReSign|src.c:49571 : 2 hits, %0 failures -UnSign|src.c:40551 : 2 hits, %0 failures -ReSign|src.c:45430 : 2 hits, %0 failures -ReSign|src.c:40555 : 2 hits, %0 failures -ReSign|src.c:38546 : 2 hits, %0 failures -ReSign|src.c:38559 : 2 hits, %0 failures -ReSign|src.c:37855 : 2 hits, %0 failures -ReSign|src.c:38571 : 2 hits, %0 failures -ReSign|src.c:35129 : 2 hits, %0 failures -ReSign|src.c:49590 : 2 hits, %0 failures -ReSign|src.c:49591 : 2 hits, %0 failures -ReSign|src.c:108675 : 2 hits, %0 failures -ReSign|src.c:108713 : 2 hits, %0 failures -ReSign|src.c:108724 : 2 hits, %0 failures -ReSign|src.c:108742 : 2 hits, %0 failures -ReSign|src.c:18167 : 1 hits, %0 failures -ReSign|src.c:18171 : 1 hits, %0 failures -ReSign|src.c:18174 : 1 hits, %0 failures -ReSign|src.c:18196 : 1 hits, %0 failures -ReSign|src.c:108131 : 1 hits, %0 failures -ReSign|src.c:34828 : 1 hits, %0 failures -ReSign|src.c:35801 : 1 hits, %0 failures -ReSign|src.c:108134 : 1 hits, %0 failures -ReSign|dlmalloc.c:2958 : 1 hits, %0 failures -ReSign|dlmalloc.c:3912 : 1 hits, %0 failures -ReSign|dlmalloc.c:3915 : 1 hits, %0 failures -UnSign|dlmalloc.c:3918 : 1 hits, %0 failures -ReSign|dlmalloc.c:4000 : 1 hits, %0 failures -ReSign|src.c:14487 : 1 hits, %0 failures -ReSign|src.c:108138 : 1 hits, %0 failures -ReSign|src.c:35460 : 1 hits, %0 failures -ReSign|src.c:35469 : 1 hits, %0 failures -ReSign|src.c:128492 : 1 hits, %0 failures -ReSign|src.c:128515 : 1 hits, %0 failures -ReSign|src.c:128517 : 1 hits, %0 failures -ReSign|src.c:128518 : 1 hits, %0 failures -ReSign|src.c:80712 : 1 hits, %0 failures -ReSign|src.c:80716 : 1 hits, %0 failures -ReSign|src.c:80717 : 1 hits, %0 failures -ReSign|src.c:128520 : 1 hits, %0 failures -ReSign|src.c:128530 : 1 hits, %0 failures -ReSign|src.c:80737 : 1 hits, %0 failures -ReSign|src.c:80741 : 1 hits, %0 failures -ReSign|src.c:128532 : 1 hits, %0 failures -ReSign|src.c:128533 : 1 hits, %0 failures -ReSign|src.c:128536 : 1 hits, %0 failures -ReSign|src.c:128537 : 1 hits, %0 failures -ReSign|src.c:128538 : 1 hits, %0 failures -ReSign|src.c:106054 : 1 hits, %0 failures -ReSign|src.c:106057 : 1 hits, %0 failures -UnSign|src.c:106057 : 1 hits, %0 failures -ReSign|src.c:74257 : 1 hits, %0 failures -UnSign|src.c:74200 : 1 hits, %0 failures -ReSign|src.c:74200 : 1 hits, %0 failures -UnSign|src.c:74201 : 1 hits, %0 failures -UnSign|src.c:99551 : 1 hits, %0 failures -ReSign|src.c:99551 : 1 hits, %0 failures -UnSign|src.c:99577 : 1 hits, %0 failures -ReSign|src.c:99577 : 1 hits, %0 failures -UnSign|src.c:83714 : 1 hits, %0 failures -ReSign|src.c:83726 : 1 hits, %0 failures -UnSign|src.c:99016 : 1 hits, %0 failures -UnSign|src.c:99024 : 1 hits, %0 failures -ReSign|src.c:99025 : 1 hits, %0 failures -ReSign|src.c:99028 : 1 hits, %0 failures -ReSign|src.c:99037 : 1 hits, %0 failures -ReSign|src.c:99040 : 1 hits, %0 failures -ReSign|src.c:99045 : 1 hits, %0 failures -ReSign|src.c:99073 : 1 hits, %0 failures -UnSign|src.c:99073 : 1 hits, %0 failures -ReSign|src.c:99094 : 1 hits, %0 failures -UnSign|src.c:101427 : 1 hits, %0 failures -ReSign|src.c:101427 : 1 hits, %0 failures -UnSign|src.c:73783 : 1 hits, %0 failures -ReSign|src.c:73783 : 1 hits, %0 failures -ReSign|src.c:73788 : 1 hits, %0 failures -ReSign|src.c:73793 : 1 hits, %0 failures -UnSign|src.c:73802 : 1 hits, %0 failures -ReSign|src.c:73802 : 1 hits, %0 failures -ReSign|src.c:73818 : 1 hits, %0 failures -UnSign|src.c:73839 : 1 hits, %0 failures -ReSign|src.c:98231 : 1 hits, %0 failures -UnSign|src.c:98232 : 1 hits, %0 failures -ReSign|src.c:98232 : 1 hits, %0 failures -ReSign|src.c:98234 : 1 hits, %0 failures -UnSign|src.c:98235 : 1 hits, %0 failures -ReSign|src.c:98235 : 1 hits, %0 failures -UnSign|src.c:73853 : 1 hits, %0 failures -ReSign|src.c:73853 : 1 hits, %0 failures -ReSign|src.c:73860 : 1 hits, %0 failures -ReSign|src.c:74652 : 1 hits, %0 failures -UnSign|src.c:74652 : 1 hits, %0 failures -ReSign|src.c:128539 : 1 hits, %0 failures -ReSign|src.c:128540 : 1 hits, %0 failures -UnSign|src.c:48989 : 1 hits, %0 failures -ReSign|src.c:128543 : 1 hits, %0 failures -ReSign|src.c:128544 : 1 hits, %0 failures -ReSign|src.c:128545 : 1 hits, %0 failures -ReSign|src.c:101748 : 1 hits, %0 failures -ReSign|src.c:101755 : 1 hits, %0 failures -UnSign|src.c:101764 : 1 hits, %0 failures -ReSign|src.c:101764 : 1 hits, %0 failures -ReSign|src.c:101767 : 1 hits, %0 failures -ReSign|src.c:101771 : 1 hits, %0 failures -ReSign|src.c:102281 : 1 hits, %0 failures -ReSign|src.c:66230 : 1 hits, %0 failures -ReSign|src.c:128547 : 1 hits, %0 failures -UnSign|src.c:100866 : 1 hits, %0 failures -ReSign|src.c:101223 : 1 hits, %0 failures -ReSign|src.c:101228 : 1 hits, %0 failures -UnSign|src.c:102265 : 1 hits, %0 failures -ReSign|src.c:102265 : 1 hits, %0 failures -ReSign|src.c:102268 : 1 hits, %0 failures -ReSign|src.c:102275 : 1 hits, %0 failures -UnSign|src.c:102306 : 1 hits, %0 failures -ReSign|src.c:102306 : 1 hits, %0 failures -ReSign|src.c:102309 : 1 hits, %0 failures -ReSign|src.c:102316 : 1 hits, %0 failures -ReSign|src.c:128548 : 1 hits, %0 failures -ReSign|src.c:128549 : 1 hits, %0 failures -ReSign|src.c:128468 : 1 hits, %0 failures diff --git a/tools/bisect_pair.py b/tools/bisect_pair.py index 8eea0d61..cdb76286 100644 --- a/tools/bisect_pair.py +++ b/tools/bisect_pair.py @@ -23,9 +23,15 @@ rightf = open('right', 'w') rightf.write(file2) rightf.close() +def run_code(name): + ret = run_js(name, stderr=PIPE, full_output=True) + # fix stack traces + ret = filter(lambda line: not line.startswith(' at ') and not name in line, ret.split('\n')) + return '\n'.join(ret) + print 'running files' -left_result = run_js('left', stderr=PIPE) -right_result = run_js('right', stderr=PIPE) # right as in left-right, not as in correct +left_result = run_code('left') +right_result = run_code('right') # right as in left-right, not as in correct assert left_result != right_result # Calculate diff chunks @@ -52,31 +58,31 @@ high = len(chunks) print 'beginning bisection, %d chunks' % high for mid in range(high): - print ' current: %d' % mid + print ' current: %d' % mid, # Take chunks from the middle and on. This is important because the eliminator removes variables, so starting from the beginning will add errors curr_diff = '\n'.join(map(lambda parts: '\n'.join(parts), chunks[mid:])) + '\n' difff = open('diff.diff', 'w') difff.write(curr_diff) difff.close() shutil.copy('left', 'middle') - Popen(['patch', 'middle', 'diff.diff'], stdout=PIPE, stderr=PIPE).communicate() - result = run_js('middle', stderr=PIPE) - if result == left_result: - print 'found where it starts to work: %d' % mid + Popen(['patch', 'middle', 'diff.diff'], stdout=PIPE).communicate() + shutil.copyfile('middle', 'middle' + str(mid)) + result = run_code('middle') + print result == left_result, result == right_result#, 'XXX', left_result, 'YYY', result, 'ZZZ', right_result + if mid == 0: + assert result == right_result, '<<< ' + result + ' ??? ' + right_result + ' >>>' + print 'sanity check passed (a)' + if mid == high-1: + assert result == left_result, '<<< ' + result + ' ??? ' + left_result + ' >>>' + print 'sanity check passed (b)' + if result != right_result: + print 'found where it changes: %d' % mid found = mid break -critical = '\n'.join(chunks[found-1]) + '\n' - +critical = Popen(['diff', '-U', '5', 'middle' + str(mid-1), 'middle' + str(mid)], stdout=PIPE).communicate()[0] c = open('critical.diff', 'w') c.write(critical) c.close() -print 'sanity check' -shutil.copy('middle', 'middle2') -Popen(['patch', 'middle2', 'critical.diff'], stdout=PIPE, stderr=PIPE).communicate() -assert run_js('middle', stderr=PIPE) == left_result, 'middle was expected %s' % left_result -assert run_js('middle2', stderr=PIPE) != left_result, 'middle2 was expected NOT %s' % left_result - -print 'middle is like left, middle2 is like right, critical.diff is the difference that matters,' -print critical +print 'middle%d is like left, middle%d is like right, critical.diff is the difference that matters' % (mid-1, mid), 'diff:', critical diff --git a/tools/eliminator/asm-eliminator-test-output.js b/tools/eliminator/asm-eliminator-test-output.js new file mode 100644 index 00000000..3170bd9c --- /dev/null +++ b/tools/eliminator/asm-eliminator-test-output.js @@ -0,0 +1,103 @@ +function asm(x, y) { + x = +x; + y = y | 0; + var a = 0; + a = cheez(y + ~~x | 0) | 0; + fleefl(a * a | 0, a | 0); +} +function __Z11printResultPiS_j($needle, $haystack, $len) { + $needle = $needle | 0; + $haystack = $haystack | 0; + $len = $len | 0; + var $3 = 0, __stackBase__ = 0; + __stackBase__ = STACKTOP; + $3 = _bsearch($needle, $haystack, $len, 4, 2); + if (($3 | 0) == 0) { + _puts(_str | 0); + STACKTOP = __stackBase__; + return; + } else { + _printf(__str1 | 0, (tempInt = STACKTOP, STACKTOP = STACKTOP + 4 | 0, HEAP32[(tempInt & 16777215) >> 2] = HEAP32[($3 & 16777215) >> 2] | 0, tempInt)); + STACKTOP = __stackBase__; + return; + } +} +function _segment_holding($addr) { + $addr = $addr | 0; + var $sp_0 = 0, $3 = 0, $12 = 0, $_0 = 0, label = 0; + $sp_0 = __gm_ + 444 | 0; + while (1) { + $3 = HEAP32[(($sp_0 | 0) & 16777215) >> 2] | 0; + if (!($3 >>> 0 > $addr >>> 0)) { + if (($3 + (HEAP32[(($sp_0 + 4 | 0) & 16777215) >> 2] | 0) | 0) >>> 0 > $addr >>> 0) { + $_0 = $sp_0; + label = 1658; + break; + } + } + $12 = HEAP32[(($sp_0 + 8 | 0) & 16777215) >> 2] | 0; + if (($12 | 0) == 0) { + $_0 = 0; + label = 1659; + break; + } else { + $sp_0 = $12; + } + } + if (label == 1659) { + return $_0; + } else if (label == 1658) { + return $_0; + } +} +function __ZN5identC2EiPKcPci($this, $n, $a) { + $this = $this | 0; + $n = $n | 0; + $a = $a | 0; + HEAP32[($this & 16777215) >> 2] = __ZTV5ident + 8 | 0; + HEAP32[($this + 4 & 16777215) >> 2] = 5; + HEAP32[($this + 8 & 16777215) >> 2] = $n; + HEAP32[($this + 20 & 16777215) >> 2] = 2147483647; + HEAP32[($this + 24 & 16777215) >> 2] = 0; + HEAP32[($this + 28 & 16777215) >> 2] = $a; + HEAP32[($this + 32 & 16777215) >> 2] = 0; + HEAP32[($this + 40 & 16777215) >> 2] = 1; + return; +} +function _vec2Length($this) { + $this = $this | 0; + var $__first_addr_i = 0, $__last_addr_i = 0, __stackBase__ = 0; + __stackBase__ = STACKTOP; + STACKTOP = STACKTOP + 8 | 0; + $__first_addr_i = __stackBase__; + $__last_addr_i = __stackBase__ + 4; + STACKTOP = __stackBase__; + return 0; +} +function exc($this) { + $this = $this | 0; + var $1 = 0, $5 = 0; + $1 = (function() { + try { + __THREW__ = false; + return __ZNSt3__16locale8__globalEv(); + } catch (e) { + if (typeof e != "number") throw e; + if (ABORT) throw e; + __THREW__ = true; + Module.print("Exception: " + e + ", currently at: " + (new Error).stack); + return null; + } + })(); + if (!__THREW__) { + $5 = HEAP32[(($1 | 0) & 16777215) >> 2] | 0; + HEAP32[(($this | 0) & 16777215) >> 2] = $5; + __ZNSt3__114__shared_count12__add_sharedEv($5 | 0); + return; + } else { + $8$0 = ___cxa_find_matching_catch(HEAP32[(_llvm_eh_exception.buf & 16777215) >> 2] | 0, HEAP32[(_llvm_eh_exception.buf + 4 & 16777215) >> 2] | 0, []); + $8$1 = tempRet0; + ___cxa_call_unexpected($8$0); + } +} + diff --git a/tools/eliminator/asm-eliminator-test.js b/tools/eliminator/asm-eliminator-test.js new file mode 100644 index 00000000..ce34a7a6 --- /dev/null +++ b/tools/eliminator/asm-eliminator-test.js @@ -0,0 +1,134 @@ +function asm(x, y) { + x = +x; + y = y|0; + var a = 0, b = +0, c = 0; + var label = 0; + a = cheez((y+~~x)|0)|0; + b = a*a; + fleefl(b|0, a|0); +} +function __Z11printResultPiS_j($needle, $haystack, $len) { + $needle = $needle | 0; + $haystack = $haystack | 0; + $len = $len | 0; + var $1 = 0, $2 = 0, $3 = 0, $4 = 0, $puts = 0, $7 = 0, $8 = 0, $9 = 0; + var label = 0; + var __stackBase__ = 0; + __stackBase__ = STACKTOP; + $1 = $needle; + $2 = $haystack; + $3 = _bsearch($1, $2, $len, 4, 2); + $4 = ($3 | 0) == 0; + if ($4) { + $puts = _puts(_str | 0); + STACKTOP = __stackBase__; + return; + } else { + $7 = $3; + $8 = HEAP32[($7 & 16777215) >> 2] | 0; + $9 = _printf(__str1 | 0, (tempInt = STACKTOP, STACKTOP = STACKTOP + 4 | 0, HEAP32[(tempInt & 16777215) >> 2] = $8, tempInt)); + STACKTOP = __stackBase__; + return; + } +} +function _segment_holding($addr) { + $addr = $addr | 0; + var $sp_0 = 0, $2 = 0, $3 = 0, $4 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0; + var $11 = 0, $12 = 0, $13 = 0, $_0 = 0; + var label = 0; + $sp_0 = __gm_ + 444 | 0; + while (1) { + $2 = $sp_0 | 0; + $3 = HEAP32[($2 & 16777215) >> 2] | 0; + $4 = $3 >>> 0 > $addr >>> 0; + if (!$4) { + $6 = $sp_0 + 4 | 0; + $7 = HEAP32[($6 & 16777215) >> 2] | 0; + $8 = $3 + $7 | 0; + $9 = $8 >>> 0 > $addr >>> 0; + if ($9) { + $_0 = $sp_0; + label = 1658; + break; + } + } + $11 = $sp_0 + 8 | 0; + $12 = HEAP32[($11 & 16777215) >> 2] | 0; + $13 = ($12 | 0) == 0; + if ($13) { + $_0 = 0; + label = 1659; + break; + } else { + $sp_0 = $12; + } + } + if (label == 1659) { + return $_0; + } else if (label == 1658) { + return $_0; + } +} +function __ZN5identC2EiPKcPci($this, $n, $a) { + $this = $this | 0; + $n = $n | 0; + $a = $a | 0; + HEAP32[($this & 16777215) >> 2] = __ZTV5ident + 8 | 0; + HEAP32[($this + 4 & 16777215) >> 2] = 5; + HEAP32[($this + 8 & 16777215) >> 2] = $n; + HEAP32[($this + 20 & 16777215) >> 2] = 2147483647; + HEAP32[($this + 24 & 16777215) >> 2] = 0; + HEAP32[($this + 28 & 16777215) >> 2] = $a; + HEAP32[($this + 32 & 16777215) >> 2] = 0; + HEAP32[($this + 40 & 16777215) >> 2] = 1; + return; +} +function _vec2Length($this) { + $this = $this | 0; + var $__first_addr_i = 0, $__last_addr_i = 0, $__comp_addr_i = 0, $a13 = 0, $a14 = 0, $a18 = 0, $a19 = 0; + var label = 0; + var __stackBase__ = 0; + __stackBase__ = STACKTOP; + STACKTOP = STACKTOP + 8 | 0; + $__first_addr_i = __stackBase__; + $__last_addr_i = __stackBase__ + 4; + $a13 = $__first_addr_i; + $a14 = $__last_addr_i; + $a18 = $__first_addr_i; + $a19 = $__last_addr_i; + STACKTOP = __stackBase__; + return 0; +} +function exc($this) { + $this = $this | 0; + var $1 = 0, $3 = 0, $4 = 0, $5 = 0, $6 = 0, $8 = +0, $9 = 0; + var label = 0; + var $1 = (function() { + try { + __THREW__ = false; + return __ZNSt3__16locale8__globalEv(); + } catch (e) { + if (typeof e != "number") throw e; + if (ABORT) throw e; + __THREW__ = true; + Module.print("Exception: " + e + ", currently at: " + (new Error).stack); + return null; + } + })(); + if (!__THREW__) { + $3 = $this | 0; + $4 = $1 | 0; + $5 = HEAP32[($4 & 16777215) >> 2] | 0; + HEAP32[($3 & 16777215) >> 2] = $5; + $6 = $5 | 0; + __ZNSt3__114__shared_count12__add_sharedEv($6); + return; + } else { + $8$0 = ___cxa_find_matching_catch(HEAP32[(_llvm_eh_exception.buf & 16777215) >> 2] | 0, HEAP32[(_llvm_eh_exception.buf + 4 & 16777215) >> 2] | 0, []); + $8$1 = tempRet0; + $9 = $8$0; + ___cxa_call_unexpected($9); + } +} +// EMSCRIPTEN_GENERATED_FUNCTIONS: ["asm", "__Z11printResultPiS_j", "_segment_holding", "__ZN5identC2EiPKcPci", "_vec2Length", "exc"] + diff --git a/tools/eliminator/eliminator-test-output.js b/tools/eliminator/eliminator-test-output.js index ede34103..cc164f57 100644 --- a/tools/eliminator/eliminator-test-output.js +++ b/tools/eliminator/eliminator-test-output.js @@ -6132,4 +6132,12 @@ function _mallocNoU($bytes) { return $mem_0; return null; } +function asm(x, y) { + x = +x; + y = y | 0; + var a = 0, b = +0; + a = cheez(y + ~~x | 0) | 0; + b = a * a; + fleefl(b | 0, a | 0); +} diff --git a/tools/eliminator/eliminator-test.js b/tools/eliminator/eliminator-test.js index e44f28ad..07a41d71 100644 --- a/tools/eliminator/eliminator-test.js +++ b/tools/eliminator/eliminator-test.js @@ -8828,5 +8828,14 @@ function _mallocNoU($bytes) { return $mem_0; return null; } -// EMSCRIPTEN_GENERATED_FUNCTIONS: ["a", "b", "c", "f", "g", "h", "py", "r", "t", "f2", "f3", "llvm3_1", "_inflate", "_malloc", "_mallocNoU"] +function asm(x, y) { // asm-style code, without special asm requested so will not be fully optimized + x = +x; + y = y|0; + var a = 0, b = +0, c = 0; + var label = 0; + a = cheez((y+~~x)|0)|0; + b = a*a; + fleefl(b|0, a|0); +} +// EMSCRIPTEN_GENERATED_FUNCTIONS: ["a", "b", "c", "f", "g", "h", "py", "r", "t", "f2", "f3", "llvm3_1", "_inflate", "_malloc", "_mallocNoU", "asm"] diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 29aecdcf..518e451a 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -263,6 +263,10 @@ function emptyNode() { // XXX do we need to create new nodes here? can't we reus return ['toplevel', []] } +function isEmptyNode(node) { + return node.length == 2 && node[0] == 'toplevel' && node[1].length == 0; +} + // Passes // Dump the AST. Useful for debugging. For example, @@ -1197,14 +1201,163 @@ function loopOptimizer(ast) { vacuum(ast); } +function unVarify(vars, ret) { // transform var x=1, y=2 etc. into (x=1, y=2), i.e., the same assigns, but without a var definition + ret = ret || []; + ret[0] = 'stat'; + if (vars.length == 1) { + ret[1] = ['assign', true, ['name', vars[0][0]], vars[0][1]]; + } else { + ret[1] = []; + var curr = ret[1]; + for (var i = 0; i < vars.length-1; i++) { + curr[0] = 'seq'; + curr[1] = ['assign', true, ['name', vars[i][0]], vars[i][1]]; + if (i != vars.length-2) curr = curr[2] = []; + } + curr[2] = ['assign', true, ['name', vars[vars.length-1][0]], vars[vars.length-1][1]]; + } + return ret; +} + +// asm.js support code - normalize (convert asm.js code to 'normal' JS, without +// annotations, plus explicit metadata) and denormalize (vice versa) +var ASM_INT = 0; +var ASM_DOUBLE = 1; + +function detectAsmCoercion(node) { + // for params, +x vs x|0, for vars, +0 vs 0, so check for "+" + return node[0] == 'unary-prefix' ? ASM_DOUBLE : ASM_INT; +} + +function makeAsmParamCoercion(param, type) { + return type == ASM_INT ? ['binary', '|', ['name', param], ['num', 0]] : ['unary-prefix', '+', ['name', param]]; +} + +function makeAsmVarDef(v, type) { + return [v, type == ASM_INT ? ['num', 0] : ['unary-prefix', '+', ['num', 0]]]; +} + +function normalizeAsm(func) { + //printErr('pre-normalize \n\n' + astToSrc(func) + '\n\n'); + var data = { + params: {}, // ident => ASM_* type + vars: {}, // ident => ASM_* type + }; + // process initial params + var stats = func[3]; + var i = 0; + while (i < stats.length) { + var node = stats[i]; + if (node[0] != 'stat' || node[1][0] != 'assign' || node[1][2][0] != 'name') break; + node = node[1]; + data.params[node[2][1]] = detectAsmCoercion(node[3]); + stats[i] = emptyNode(); + i++; + } + // process initial variable definitions + outer: + while (i < stats.length) { + var node = stats[i]; + if (node[0] != 'var') break; + for (var j = 0; j < node[1].length; j++) { + var v = node[1][j]; + var name = v[0]; + var value = v[1]; + if (!(name in data.vars)) { + assert(value[0] == 'num' || (value[0] == 'unary-prefix' && value[2][0] == 'num')); // must be valid coercion no-op + data.vars[name] = detectAsmCoercion(value); + v.length = 1; // make an un-assigning var + } else { + break outer; + } + } + i++; + } + // finally, look for other var definitions and collect them + while (i < stats.length) { + traverse(stats[i], function(node, type) { + if (type == 'var') { + unVarify(node[1], node); + } else if (type == 'dot') { + if (node[1][0] == 'name' && node[1][1] == 'Math') { + // transform Math.max to Math_max; we forward in the latter version + node[0] = 'name'; + node[1] = 'Math_' + node[2]; + } + } + }); + i++; + } + //printErr('normalized \n\n' + astToSrc(func) + '\n\nwith: ' + JSON.stringify(data)); + return data; +} + +function denormalizeAsm(func, data) { + //printErr('pre-denormalize \n\n' + astToSrc(func) + '\n\nwith: ' + JSON.stringify(data)); + var stats = func[3]; + // Remove var definitions, if any + for (var i = 0; i < stats.length; i++) { + if (stats[i][0] == 'var') { + stats[i] = emptyNode(); + } else { + if (!isEmptyNode(stats[i])) break; + } + } + // each param needs a line; reuse emptyNodes as much as we can + var numParams = 0; + for (var i in data.params) numParams++; + var emptyNodes = 0; + while (emptyNodes < stats.length) { + if (!isEmptyNode(stats[emptyNodes])) break; + emptyNodes++; + } + var neededEmptyNodes = numParams + 1; // params plus one big var + if (neededEmptyNodes > emptyNodes) { + var args = [0, 0]; + for (var i = 0; i < neededEmptyNodes - emptyNodes; i++) args[i+2] = 0; + stats.splice.apply(stats, args); + } + // add param coercions + var next = 0; + func[2].forEach(function(param) { + stats[next++] = ['stat', ['assign', true, ['name', param], makeAsmParamCoercion(param, data.params[param])]]; + }); + // add variable definitions + var varDefs = []; + for (var v in data.vars) { + varDefs.push(makeAsmVarDef(v, data.vars[v])); + } + if (varDefs.length) { + stats[next] = ['var', varDefs]; + } else { + stats[next] = emptyNode(); + } + //printErr('denormalized \n\n' + astToSrc(func) + '\n\n'); +} + // Very simple 'registerization', coalescing of variables into a smaller number. // We do not optimize when there are switches, so this pass only makes sense with // relooping. // TODO: Consider how this fits in with the rest of the optimization toolchain. Do // we still need the eliminator? Closure? And in what order? Perhaps just // closure simple? -function registerize(ast) { +function registerize(ast, asm) { traverseGeneratedFunctions(ast, function(fun) { + if (asm) var asmData = normalizeAsm(fun); + // Add parameters as a first (fake) var (with assignment), so they get taken into consideration + var params = {}; // note: params are special, they can never share a register between them (see later) + if (fun[2] && fun[2].length) { + var assign = ['num', 0]; + fun[3].unshift(['var', fun[2].map(function(param) { + params[param] = 1; + return [param, assign]; + })]); + } + if (asm) { + // copy params into vars + for (var p in asmData.params) asmData.vars[p] = asmData.params[p]; + //printErr('fake params: \n\n' + astToSrc(fun) + '\n\n'); + } // Replace all var definitions with assignments; we will add var definitions at the top after we registerize // We also mark local variables - i.e., having a var definition var localVars = {}; @@ -1213,18 +1366,8 @@ function registerize(ast) { if (type == 'var') { node[1].forEach(function(defined) { localVars[defined[0]] = 1 }); var vars = node[1].filter(function(varr) { return varr[1] }); - if (vars.length > 1) { - var ret = ['stat', []]; - var curr = ret[1]; - for (var i = 0; i < vars.length-1; i++) { - curr[0] = 'seq'; - curr[1] = ['assign', true, ['name', vars[i][0]], vars[i][1]]; - if (i != vars.length-2) curr = curr[2] = []; - } - curr[2] = ['assign', true, ['name', vars[vars.length-1][0]], vars[vars.length-1][1]]; - return ret; - } else if (vars.length == 1) { - return ['stat', ['assign', true, ['name', vars[0][0]], vars[0][1]]]; + if (vars.length >= 1) { + return unVarify(vars); } else { return emptyNode(); } @@ -1293,7 +1436,7 @@ function registerize(ast) { // we just use a fresh register to make sure we avoid this, but it could be // optimized to check for safe registers (free, and not used in this loop level). var varRegs = {}; // maps variables to the register they will use all their life - var freeRegs = []; + var freeRegsClasses = asm ? [[], []] : []; // two classes for asm, one otherwise var nextReg = 1; var fullNames = {}; var loopRegs = {}; // for each loop nesting level, the list of bound variables @@ -1301,18 +1444,24 @@ function registerize(ast) { var saved = 0; var activeOptimizables = {}; var optimizableLoops = {}; + var paramRegs = {}; // true if the register is used by a parameter (and so needs no def at start of function; also cannot + // be shared with another param, each needs its own) function decUse(name) { if (!varUses[name]) return false; // no uses left, or not a relevant variable if (optimizables[name]) activeOptimizables[name] = 1; var reg = varRegs[name]; + if (asm) assert(name in asmData.vars, name); + var freeRegs = asm ? freeRegsClasses[asmData.vars[name]] : freeRegsClasses; if (!reg) { // acquire register - if (optimizables[name] && freeRegs.length > 0) { + if (optimizables[name] && freeRegs.length > 0 && + !(params[name] && paramRegs[freeRegs[freeRegs.length-1]])) { // do not share registers between parameters reg = freeRegs.pop(); saved++; } else { reg = nextReg++; - fullNames[reg] = 'r' + reg; // TODO: even smaller names + fullNames[reg] = (asm ? (asmData.vars[name] ? 'd' : 'i') : 'r') + reg; // TODO: even smaller names + if (params[name]) paramRegs[reg] = 1; } varRegs[name] = reg; } @@ -1353,24 +1502,61 @@ function registerize(ast) { if (type in LOOP) { // Free registers that were locked to this loop if (loopRegs[loops]) { - freeRegs = freeRegs.concat(loopRegs[loops]); - loopRegs[loops] = []; + if (asm) { + loopRegs[loops].forEach(function(loopReg) { + freeRegsClasses[fullNames[loopReg][0] == 'i' ? ASM_INT : ASM_DOUBLE].push(loopReg); + }); + } else { + freeRegsClasses = freeRegsClasses.concat(loopRegs[loops]); + } + loopRegs[loops].length = 0; } loops--; } }); - // Add vars at the beginning - if (nextReg > 1) { - var vars = []; + if (fun[2] && fun[2].length) { + fun[2].length = 0; // clear params, we will fill with registers + fun[3].shift(); // remove fake initial var + } + //printErr('var regs: ' + JSON.stringify(varRegs) + '\n\nparam regs: ' + JSON.stringify(paramRegs)); + if (!asm) { + if (nextReg > 1) { + var vars = []; + for (var i = 1; i < nextReg; i++) { + var reg = fullNames[i]; + if (!paramRegs[i]) { + vars.push([reg]); + } else { + fun[2].push(reg); + } + } + getStatements(fun).unshift(['var', vars]); + } + } else { + //printErr('unfake params: \n\n' + astToSrc(fun) + '\n\n'); + var finalAsmData = { + params: {}, + vars: {}, + }; for (var i = 1; i < nextReg; i++) { - vars.push([fullNames[i]]); + var reg = fullNames[i]; + var type = reg[0] == 'i' ? ASM_INT : ASM_DOUBLE + if (!paramRegs[i]) { + finalAsmData.vars[reg] = type; + } else { + finalAsmData.params[reg] = type; + fun[2].push(reg); + } } - getStatements(fun).unshift(['var', vars]); + denormalizeAsm(fun, finalAsmData); } - //printErr(fun[1] + ': saved ' + saved + ' / ' + (saved + nextReg - 1) + ' vars through registerization'); // not totally accurate }); } +function registerizeAsm(ast) { + registerize(ast, true); +} + // Eliminator aka Expressionizer // // The goal of this pass is to eliminate unneeded variables (which represent one of the infinite registers in the LLVM @@ -1408,9 +1594,10 @@ var NODES_WITHOUT_ELIMINATION_SIDE_EFFECTS = set('name', 'num', 'string', 'binar var IGNORABLE_ELIMINATOR_SCAN_NODES = set('num', 'toplevel', 'string', 'break', 'continue', 'dot'); // dot can only be STRING_TABLE.* var ABORTING_ELIMINATOR_SCAN_NODES = set('new', 'object', 'function', 'defun', 'switch', 'for', 'while', 'array', 'throw'); // we could handle some of these, TODO, but nontrivial (e.g. for while, the condition is hit multiple times after the body) -function eliminate(ast, memSafe) { +function eliminate(ast, memSafe, asm) { // Find variables that have a single use, and if they can be eliminated, do so traverseGeneratedFunctions(ast, function(func, type) { + if (asm) var asmData = normalizeAsm(func); //printErr('eliminate in ' + func[1]); // First, find the potentially eliminatable functions: that have one definition and one use @@ -1418,7 +1605,7 @@ function eliminate(ast, memSafe) { var uses = {}; var values = {}; var locals = {}; - var varsToRemove = {}; // variables being removed, that we can eliminate all 'var x;' of + var varsToRemove = {}; // variables being removed, that we can eliminate all 'var x;' of (this refers to 'var' nodes we should remove) var varsToTryToRemove = {}; // variables that have 0 uses, but have side effects - when we scan we can try to remove them // add arguments as locals if (func[2]) { @@ -1435,7 +1622,7 @@ function eliminate(ast, memSafe) { var name = node1i[0]; var value = node1i[1]; if (value) { - if (!definitions[name]) definitions[name] = 0; + if (!(name in definitions)) definitions[name] = 0; definitions[name]++; if (!values[name]) values[name] = value; } @@ -1450,7 +1637,7 @@ function eliminate(ast, memSafe) { var target = node[2]; if (target[0] == 'name') { var name = target[1]; - if (!definitions[name]) definitions[name] = 0; + if (!(name in definitions)) definitions[name] = 0; definitions[name]++; if (!uses[name]) uses[name] = 0; if (!values[name]) values[name] = node[3]; @@ -1461,6 +1648,7 @@ function eliminate(ast, memSafe) { } }); var potentials = {}; // local variables with 1 definition and 1 use + var sideEffectFree = {}; // whether a local variable has no side effects in its definition for (var name in locals) { if (definitions[name] == 1 && uses[name] == 1) { potentials[name] = 1; @@ -1476,6 +1664,7 @@ function eliminate(ast, memSafe) { } if (!hasSideEffects) { varsToRemove[name] = 1; // remove it normally + sideEffectFree[name] = true; } else { varsToTryToRemove[name] = 1; // try to remove it later during scanning } @@ -1483,10 +1672,11 @@ function eliminate(ast, memSafe) { } //printErr('defs: ' + JSON.stringify(definitions)); //printErr('uses: ' + JSON.stringify(uses)); + //printErr('values: ' + JSON.stringify(values)); //printErr('locals: ' + JSON.stringify(locals)); //printErr('varsToRemove: ' + JSON.stringify(varsToRemove)); - //printErr('2varsToTryToRemove: ' + JSON.stringify(varsToTryToRemove)); - definitions = uses = values = null; + //printErr('varsToTryToRemove: ' + JSON.stringify(varsToTryToRemove)); + definitions = values = null; //printErr('potentials: ' + JSON.stringify(potentials)); // We can now proceed through the function. In each list of statements, we try to eliminate var tracked = {}; @@ -1618,6 +1808,12 @@ function eliminate(ast, memSafe) { invalidateGlobals(); globalsInvalidated = true; } + // if we can track this name (that we assign into), and it has 0 uses and we want to remove its 'var' + // definition - then remove it right now, there is no later chance + if (allowTracking && (name in varsToRemove) && uses[name] == 0) { + track(name, node[3], node); + doEliminate(name, node); + } } else { // replace it in-place node.length = value.length; @@ -1768,24 +1964,31 @@ function eliminate(ast, memSafe) { var info = tracked[name]; delete tracked[name]; var defNode = info.defNode; - if (defNode[0] == 'var') { - defNode[1].forEach(function(pair) { - if (pair[0] == name) { - value = pair[1]; - } - }); - assert(value); - } else { // assign - value = defNode[3]; - // wipe out the assign - defNode[0] = 'toplevel'; - defNode[1] = []; - defNode.length = 2; - } - // replace this node in-place - node.length = 0; - for (var i = 0; i < value.length; i++) { - node[i] = value[i]; + if (!sideEffectFree[name]) { + if (defNode[0] == 'var') { + defNode[1].forEach(function(pair) { + if (pair[0] == name) { + value = pair[1]; + } + }); + assert(value); + } else { // assign + value = defNode[3]; + // wipe out the assign + defNode[0] = 'toplevel'; + defNode[1] = []; + defNode.length = 2; + } + // replace this node in-place + node.length = 0; + for (var i = 0; i < value.length; i++) { + node[i] = value[i]; + } + } else { + // empty it out in-place + node.length = 0; + node[0] = 'toplevel'; + node[1] = []; } } traverse(func, function(block) { @@ -1808,6 +2011,7 @@ function eliminate(ast, memSafe) { tracked = {}; // not a var or assign, break all potential elimination so far } } + //printErr('delete StatBlock'); }); // clean up vars @@ -1822,6 +2026,13 @@ function eliminate(ast, memSafe) { } } }); + + if (asm) { + for (var v in varsToRemove) { + delete asmData.vars[v]; + } + denormalizeAsm(func, asmData); + } }); // A class for optimizing expressions. We know that it is legitimate to collapse @@ -1872,6 +2083,10 @@ function eliminateMemSafe(ast) { eliminate(ast, true); } +function eliminateAsm(ast) { + eliminate(ast, false, true); +} + // Passes table var compress = false, printMetadata = true; @@ -1889,8 +2104,10 @@ var passes = { hoistMultiples: hoistMultiples, loopOptimizer: loopOptimizer, registerize: registerize, + registerizeAsm: registerizeAsm, eliminate: eliminate, eliminateMemSafe: eliminateMemSafe, + eliminateAsm: eliminateAsm, compress: function() { compress = true; }, noPrintMetadata: function() { printMetadata = false; } }; @@ -1907,7 +2124,6 @@ if (metadata) setGeneratedFunctions(metadata); arguments_.slice(1).forEach(function(arg) { passes[arg](ast); }); - var js = astToSrc(ast, compress), old; // remove unneeded newlines+spaces, and print diff --git a/tools/js_optimizer.py b/tools/js_optimizer.py index 5bed4cb7..744e068a 100644 --- a/tools/js_optimizer.py +++ b/tools/js_optimizer.py @@ -53,7 +53,7 @@ def run(filename, passes, js_engine, jcache): jcache = False # If we process only generated code, find that and save the rest on the side - func_sig = re.compile('function (_[\w$]+)\(') + func_sig = re.compile('( *)function (_[\w$]+)\(') if suffix: pos = 0 gen_start = 0 @@ -62,12 +62,13 @@ def run(filename, passes, js_engine, jcache): m = func_sig.search(js, pos) if not m: break pos = m.end() - ident = m.group(1) + indent = m.group(1) + ident = m.group(2) if ident in generated: if not gen_start: gen_start = m.start() assert gen_start - gen_end = js.find('\n}\n', m.end()) + 3 + gen_end = js.find('\n%s}\n' % indent, m.end()) + (3 + len(indent)) assert gen_end > gen_start pre = js[:gen_start] post = js[gen_end:] @@ -115,7 +116,7 @@ def run(filename, passes, js_engine, jcache): if len(chunks) > 0: def write_chunk(chunk, i): - temp_file = temp_files.get('.jsfunc_%d.ll' % i).name + temp_file = temp_files.get('.jsfunc_%d.js' % i).name f = open(temp_file, 'w') f.write(chunk) f.write(suffix) @@ -128,6 +129,7 @@ def run(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) + #print [' '.join(command) for command in commands] cores = min(multiprocessing.cpu_count(), filenames) if len(chunks) > 1 and cores >= 2: diff --git a/tools/shared.py b/tools/shared.py index 1dec21cd..6f5bd646 100644 --- a/tools/shared.py +++ b/tools/shared.py @@ -433,7 +433,7 @@ def check_engine(engine): print 'Checking JS engine %s failed. Check %s. Details: %s' % (str(engine), EM_CONFIG, str(e)) return False -def timeout_run(proc, timeout, note='unnamed process'): +def timeout_run(proc, timeout, note='unnamed process', full_output=False): start = time.time() if timeout is not None: while time.time() - start < timeout and proc.poll() is None: @@ -441,13 +441,14 @@ def timeout_run(proc, timeout, note='unnamed process'): if proc.poll() is None: proc.kill() # XXX bug: killing emscripten.py does not kill it's child process! raise Exception("Timed out: " + note) - return proc.communicate()[0] + out = proc.communicate() + return '\n'.join(out) if full_output else out[0] -def run_js(filename, engine=None, args=[], check_timeout=False, stdout=PIPE, stderr=None, cwd=None): +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] 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') + return timeout_run(Popen(command, stdout=stdout, stderr=stderr, cwd=cwd), 15*60 if check_timeout else None, 'Execution', full_output=full_output) def to_cc(cxx): # By default, LLVM_GCC and CLANG are really the C++ versions. This gets an explicit C version diff --git a/tools/test-js-optimizer-asm-regs-output.js b/tools/test-js-optimizer-asm-regs-output.js new file mode 100644 index 00000000..d9aa5c0c --- /dev/null +++ b/tools/test-js-optimizer-asm-regs-output.js @@ -0,0 +1,21 @@ +function asm(d1, i2) { + d1 = +d1; + i2 = i2 | 0; + var i3 = 0, d4 = +0; + i2 = d1 + d1 | 0; + d1 = d(Math_max(10, Math_min(5, f()))); + i3 = i2 + 2 | 0; + print(i3); + d4 = d1 * 5; + return d4; +} +function _doit(i1, i2, i3) { + i1 = i1 | 0; + i2 = i2 | 0; + i3 = i3 | 0; + i1 = STACKTOP; + _printf(__str | 0, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[(tempInt & 16777215) >> 2] = i2, HEAP32[(tempInt + 4 & 16777215) >> 2] = i3, tempInt)); + STACKTOP = i1; + return 0 | 0; +} + diff --git a/tools/test-js-optimizer-asm-regs.js b/tools/test-js-optimizer-asm-regs.js new file mode 100644 index 00000000..6ae7f7d0 --- /dev/null +++ b/tools/test-js-optimizer-asm-regs.js @@ -0,0 +1,24 @@ +function asm(x, y) { + x = +x; + y = y | 0; + var int1 = 0, int2 = 0; // do not mix the types! + var double1 = +0, double2 = +0; + int1 = (x+x)|0; + double1 = d(Math.max(10, Math_min(5, f()))); + int2 = (int1+2)|0; + print(int2); + double2 = double1*5; + return double2; +} +function _doit($x, $y$0, $y$1) { + $x = $x | 0; + $y$0 = $y$0 | 0; + $y$1 = $y$1 | 0; + var __stackBase__ = 0; + __stackBase__ = STACKTOP; + _printf(__str | 0, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[(tempInt & 16777215) >> 2] = $y$0, HEAP32[(tempInt + 4 & 16777215) >> 2] = $y$1, tempInt)); + STACKTOP = __stackBase__; + return 0 | 0; +} +// EMSCRIPTEN_GENERATED_FUNCTIONS: ["asm", "_doit"] + diff --git a/tools/test-js-optimizer-regs-output.js b/tools/test-js-optimizer-regs-output.js index 90b67a47..36006b7c 100644 --- a/tools/test-js-optimizer-regs-output.js +++ b/tools/test-js-optimizer-regs-output.js @@ -197,32 +197,32 @@ function ex() { }))(); } } -function switchey(x) { - var r1, r2, r3, r4, r5, r6, r7, r8; - r1 = 5; +function switchey(r1) { + var r2, r3, r4, r5, r6, r7, r8, r9; + r2 = 5; while (1) { - switch (x = f(x, r1)) { + switch (r1 = f(r1, r2)) { case 1: - g(r1); - r2 = x + 1; - x--; + g(r2); + r3 = r1 + 1; + r1--; break; case 2: - g(r1 * 2); - r3 = x + 22; - r4 = r3 + 5; - x -= 20; + g(r2 * 2); + r4 = r1 + 22; + r5 = r4 + 5; + r1 -= 20; break; default: - r5 = x + 22; - r6 = r3 + 5; - ch(r5, r6 * r3); + r6 = r1 + 22; + r7 = r4 + 5; + ch(r6, r7 * r4); throw 99; } } - r7 = x + 1; - p(r1, r7); - r8 = x + 2; - pp(r8); + r8 = r1 + 1; + p(r2, r8); + r9 = r1 + 2; + pp(r9); } |