From ce406781eed12b2c717a088210f3e1a528462f94 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 11 Aug 2020 13:22:37 -0700 Subject: [PATCH 1/2] Remove fastcomp-only EMULATED_FUNCTION_POINTERS setting --- emcc.py | 7 +- emscripten.py | 123 +--- src/parseTools.js | 9 +- src/runtime_functions.js | 37 +- src/settings.js | 24 +- src/support.js | 59 -- ...comp_O2_EMULATED_FUNCTION_POINTERS.exports | 35 -- ...stcomp_O2_EMULATED_FUNCTION_POINTERS.funcs | 527 ------------------ ...comp_O2_EMULATED_FUNCTION_POINTERS.imports | 22 - ...astcomp_O2_EMULATED_FUNCTION_POINTERS.sent | 33 -- tests/test_core.py | 47 +- tests/test_other.py | 212 ++----- tools/building.py | 5 - tools/shared.py | 3 - 14 files changed, 46 insertions(+), 1097 deletions(-) delete mode 100644 tests/other/metadce/hello_libcxx_fastcomp_O2_EMULATED_FUNCTION_POINTERS.exports delete mode 100644 tests/other/metadce/hello_libcxx_fastcomp_O2_EMULATED_FUNCTION_POINTERS.funcs delete mode 100644 tests/other/metadce/hello_libcxx_fastcomp_O2_EMULATED_FUNCTION_POINTERS.imports delete mode 100644 tests/other/metadce/hello_libcxx_fastcomp_O2_EMULATED_FUNCTION_POINTERS.sent diff --git a/emcc.py b/emcc.py index 7ad38af643730..a249b009c9cff 100755 --- a/emcc.py +++ b/emcc.py @@ -1569,8 +1569,6 @@ def check(input_file): exit_with_error('Cannot set GLOBAL_BASE when building SIDE_MODULE') if shared.Settings.RELOCATABLE: - if 'EMULATED_FUNCTION_POINTERS' not in settings_key_changes and not shared.Settings.WASM_BACKEND: - shared.Settings.EMULATED_FUNCTION_POINTERS = 2 # by default, use optimized function pointer emulation shared.Settings.ERROR_ON_UNDEFINED_SYMBOLS = 0 shared.Settings.WARN_ON_UNDEFINED_SYMBOLS = 0 @@ -1982,9 +1980,6 @@ def include_and_export(name): if shared.Settings.EMULATE_FUNCTION_POINTER_CASTS: # emulated function pointer casts is emulated in fastcomp wasm using a binaryen pass options.binaryen_passes += ['--fpcast-emu'] - # we also need emulated function pointers for that, as we need a single flat - # table, as is standard in wasm, and not asm.js split ones. - shared.Settings.EMULATED_FUNCTION_POINTERS = 1 if shared.Settings.WASM2JS: if not shared.Settings.WASM_BACKEND: @@ -3208,7 +3203,7 @@ def do_binaryen(target, asm_target, options, memfile, wasm_binary_target, cmd += ['--mem-base=' + str(shared.Settings.GLOBAL_BASE)] # various options imply that the imported table may not be the exact size as # the wasm module's own table segments - if shared.Settings.RELOCATABLE or shared.Settings.RESERVED_FUNCTION_POINTERS > 0 or shared.Settings.EMULATED_FUNCTION_POINTERS: + if shared.Settings.RELOCATABLE or shared.Settings.RESERVED_FUNCTION_POINTERS > 0: cmd += ['--table-max=-1'] if shared.Settings.SIDE_MODULE: cmd += ['--mem-max=-1'] diff --git a/emscripten.py b/emscripten.py index c891c141d8ed9..b3cf3aeea9b78 100644 --- a/emscripten.py +++ b/emscripten.py @@ -418,14 +418,6 @@ def define_asmjs_import_names(imports): function_tables_impls = make_function_tables_impls(function_table_data) final_function_tables = '\n'.join(function_tables_impls) + '\n' + function_tables_defs - if shared.Settings.EMULATED_FUNCTION_POINTERS: - final_function_tables = ( - final_function_tables - .replace("asm['", '') - .replace("']", '') - .replace('var SIDE_FUNCTION_TABLE_', 'var FUNCTION_TABLE_') - .replace('var dynCall_', '//') - ) if DEBUG: logger.debug('asm text sizes' + str([ @@ -586,8 +578,6 @@ def create_backend_cmd(infile, temp_js): args += ['-emscripten-assertions=%d' % shared.Settings.ASSERTIONS] if shared.Settings.ALIASING_FUNCTION_POINTERS == 0: args += ['-emscripten-no-aliasing-function-pointers'] - if shared.Settings.EMULATED_FUNCTION_POINTERS: - args += ['-emscripten-emulated-function-pointers'] if shared.Settings.EMULATE_FUNCTION_POINTER_CASTS: args += ['-emscripten-emulate-function-pointer-casts'] if shared.Settings.RELOCATABLE: @@ -1125,17 +1115,6 @@ def make_bad(target=None): start = raw.index('[') end = raw.rindex(']') body = raw[start + 1:end].split(',') - if shared.Settings.EMULATED_FUNCTION_POINTERS: - def receive(item): - if item == '0': - return item - if item not in all_implemented: - # this is not implemented; it would normally be wrapped, but with emulation, we just use it directly outside - return item - in_table.add(item) - return "asm['" + item + "']" - - body = [receive(b) for b in body] for j in range(shared.Settings.RESERVED_FUNCTION_POINTERS): curr = 'jsCall_%s_%s' % (sig, j) body[1 + j] = curr @@ -1150,9 +1129,6 @@ def fix_item(item): # emulate all non-null pointer calls, if asked to if j > 0 and shared.Settings.EMULATE_FUNCTION_POINTER_CASTS and not shared.Settings.WASM and j in function_pointer_targets: proper_sig, proper_target = function_pointer_targets[j] - if shared.Settings.EMULATED_FUNCTION_POINTERS: - if proper_target in all_implemented: - proper_target = "asm['" + proper_target + "']" def make_emulated_param(i): if i >= len(sig): @@ -1188,7 +1164,7 @@ def make_emulated_param(i): # when emulating function pointers, we don't need wrappers # but if relocating, then we also have the copies in-module, and do # in wasm we never need wrappers though - if clean_item not in implemented_functions and not (shared.Settings.EMULATED_FUNCTION_POINTERS and not shared.Settings.RELOCATABLE) and not shared.Settings.WASM: + if clean_item not in implemented_functions and shared.Settings.RELOCATABLE and not shared.Settings.WASM: # this is imported into asm, we must wrap it call_ident = clean_item if call_ident in metadata['redirects']: @@ -1229,13 +1205,6 @@ def math_fix(g): return g if not g.startswith('Math_') else g.split('_')[1] -# asm.js function tables have one table in each linked asm.js module, so we -# can't just dynCall into them - ftCall exists for that purpose. In wasm, -# even linked modules share the table, so it's all fine. -def asm_js_emulated_function_pointers(): - return shared.Settings.EMULATED_FUNCTION_POINTERS and not shared.Settings.WASM - - def make_function_tables_impls(function_table_data): function_tables_impls = [] for sig, table in function_table_data.items(): @@ -1243,24 +1212,15 @@ def make_function_tables_impls(function_table_data): arg_coercions = ' '.join(['a' + str(i) + '=' + shared.JS.make_coercion('a' + str(i), sig[i]) + ';' for i in range(1, len(sig))]) coerced_args = ','.join([shared.JS.make_coercion('a' + str(i), sig[i]) for i in range(1, len(sig))]) sig_mask = str(table.count(',')) - if not (shared.Settings.WASM and shared.Settings.EMULATED_FUNCTION_POINTERS): - ret = 'FUNCTION_TABLE_%s[index&%s](%s)' % (sig, sig_mask, coerced_args) - else: - # for wasm with emulated function pointers, emit an mft_SIG(..) call, we avoid asm.js function tables there. - ret = 'mftCall_%s(index%s%s)' % (sig, ',' if len(sig) > 1 else '', coerced_args) + ret = 'FUNCTION_TABLE_%s[index&%s](%s)' % (sig, sig_mask, coerced_args) ret = ('return ' if sig[0] != 'v' else '') + shared.JS.make_coercion(ret, sig[0]) - if not asm_js_emulated_function_pointers(): - function_tables_impls.append(''' + function_tables_impls.append(''' function dynCall_%s(index%s%s) { index = index|0; %s %s; } ''' % (sig, ',' if len(sig) > 1 else '', args, arg_coercions, ret)) - else: - function_tables_impls.append(''' -var dynCall_%s = ftCall_%s; -''' % (sig, sig)) ffi_args = ','.join([shared.JS.make_coercion('a' + str(i), sig[i], ffi_arg=True) for i in range(1, len(sig))]) for i in range(shared.Settings.RESERVED_FUNCTION_POINTERS): @@ -1276,33 +1236,7 @@ def make_function_tables_impls(function_table_data): def create_mftCall_funcs(function_table_data): - if not asm_js_emulated_function_pointers(): - return [] - if shared.Settings.WASM or not shared.Settings.RELOCATABLE: - return [] - - mftCall_funcs = [] - # in wasm, emulated function pointers are just simple table calls - for sig, table in function_table_data.items(): - return_type, sig_args = sig[0], sig[1:] - num_args = len(sig_args) - params = ','.join(['ptr'] + ['p%d' % i for i in range(num_args)]) - coerced_params = ','.join([shared.JS.make_coercion('ptr', 'i')] + [shared.JS.make_coercion('p%d' % i, unfloat(sig_args[i])) for i in range(num_args)]) - coercions = ';'.join(['ptr = ptr | 0'] + ['p%d = %s' % (i, shared.JS.make_coercion('p%d' % i, unfloat(sig_args[i]))) for i in range(num_args)]) + ';' - mini_coerced_params = ','.join([shared.JS.make_coercion('p%d' % i, sig_args[i]) for i in range(num_args)]) - maybe_return = '' if return_type == 'v' else 'return' - final_return = maybe_return + ' ' + shared.JS.make_coercion('ftCall_' + sig + '(' + coerced_params + ')', unfloat(return_type)) + ';' - if shared.Settings.EMULATED_FUNCTION_POINTERS == 1: - body = final_return - else: - sig_mask = str(table.count(',')) - body = ('if (((ptr|0) >= (fb|0)) & ((ptr|0) < (fb + ' + sig_mask + ' | 0))) { ' + maybe_return + ' ' + - shared.JS.make_coercion( - 'FUNCTION_TABLE_' + sig + '[(ptr-fb)&' + sig_mask + '](' + - mini_coerced_params + ')', return_type, ffi_arg=True - ) + '; ' + ('return;' if return_type == 'v' else '') + ' }' + final_return) - mftCall_funcs.append(make_func('mftCall_' + sig, body, params, coercions) + '\n') - return mftCall_funcs + return [] def get_function_pointer_error(sig, function_table_sigs): @@ -1428,10 +1362,6 @@ def check(extern): asm_setup += create_invoke_wrappers(invoke_function_names) asm_setup += setup_function_pointers(function_table_sigs) - if shared.Settings.EMULATED_FUNCTION_POINTERS: - function_tables_impls = make_function_tables_impls(function_table_data) - asm_setup += '\n' + '\n'.join(function_tables_impls) + '\n' - return asm_setup @@ -1440,24 +1370,6 @@ def setup_function_pointers(function_table_sigs): for sig in function_table_sigs: if shared.Settings.RESERVED_FUNCTION_POINTERS: asm_setup += '\n' + shared.JS.make_jscall(sig) + '\n' - # nothing special to do here for wasm, we just use dynCalls - if not shared.Settings.WASM: - if shared.Settings.EMULATED_FUNCTION_POINTERS: - args = ['a%d' % i for i in range(len(sig) - 1)] - full_args = ['x'] + args - table_access = 'FUNCTION_TABLE_' + sig - if shared.Settings.SIDE_MODULE: - table_access = 'parentModule["' + table_access + '"]' # side module tables were merged into the parent, we need to access the global one - table_read = table_access + '[x]' - prelude = '' - if shared.Settings.ASSERTIONS: - prelude = ''' - if (x < 0 || x >= %s.length) { err("Function table mask error (out of range)"); %s ; abort(x) }''' % (table_access, get_function_pointer_error(sig, function_table_sigs)) - asm_setup += ''' - function ftCall_%s(%s) {%s - return %s(%s); - } - ''' % (sig, ', '.join(full_args), prelude, table_read, ', '.join(args)) return asm_setup @@ -1483,8 +1395,6 @@ def create_basic_funcs(function_table_sigs, invoke_function_names): for sig in function_table_sigs: if shared.Settings.RESERVED_FUNCTION_POINTERS: basic_funcs.append('jsCall_%s' % sig) - if asm_js_emulated_function_pointers(): - basic_funcs.append('ftCall_%s' % sig) return basic_funcs @@ -1505,12 +1415,6 @@ def create_basic_vars(exported_implemented_functions, forwarded_json, metadata): def create_exports(exported_implemented_functions, in_table, function_table_data, metadata): all_exported = exported_implemented_functions + function_tables(function_table_data) - # In asm.js + emulated function pointers, export all the table because we use - # JS to add the asm.js module's functions to the table (which is external - # in this mode). In wasm, we don't need that since wasm modules can - # directly add functions to the imported Table. - if not shared.Settings.WASM and shared.Settings.EMULATED_FUNCTION_POINTERS: - all_exported += in_table exports = [] for export in sorted(set(all_exported)): exports.append(quote(export) + ": " + export) @@ -1530,10 +1434,7 @@ def create_exports(exported_implemented_functions, in_table, function_table_data def function_tables(function_table_data): - if not asm_js_emulated_function_pointers(): - return ['dynCall_' + table for table in function_table_data] - else: - return [] + return ['dynCall_' + table for table in function_table_data] def create_the_global(metadata): @@ -1589,20 +1490,6 @@ def create_receiving(function_table_data, function_tables_defs, exported_impleme table = table.replace('var ' + tableName, 'var ' + tableName + ' = Module["' + tableName + '"]') receiving += table + '\n' - if shared.Settings.EMULATED_FUNCTION_POINTERS: - # in asm.js emulated function tables, emit the table on the outside, where - # JS can manage it (for wasm, a native wasm Table is used directly, and we - # don't need this) - if not shared.Settings.WASM: - receiving += '\n' + function_tables_defs.replace('// EMSCRIPTEN_END_FUNCS\n', '') - # wasm still needs definitions for dyncalls on the outside, for JS - receiving += '\n' + ''.join(['Module["dynCall_%s"] = dynCall_%s\n' % (sig, sig) for sig in function_table_data]) - if not shared.Settings.WASM: - for sig in function_table_data.keys(): - name = 'FUNCTION_TABLE_' + sig - fullname = name if not shared.Settings.SIDE_MODULE else ('SIDE_' + name) - receiving += 'Module["' + name + '"] = ' + fullname + ';\n' - return receiving diff --git a/src/parseTools.js b/src/parseTools.js index 393c23896d656..b64f6b2f4976a 100644 --- a/src/parseTools.js +++ b/src/parseTools.js @@ -1466,14 +1466,7 @@ function asmFFICoercion(value, type) { } function makeDynCall(sig) { - // asm.js function tables have one table in each linked asm.js module, so we - // can't just dynCall into them - ftCall exists for that purpose. In wasm, - // even linked modules share the table, so it's all fine. - if (EMULATED_FUNCTION_POINTERS && !WASM) { - return 'ftCall_' + sig; - } else { - return 'dynCall_' + sig; - } + return 'dynCall_' + sig; } function heapAndOffset(heap, ptr) { // given HEAP8, ptr , we return splitChunk, relptr diff --git a/src/runtime_functions.js b/src/runtime_functions.js index e5dba00f8861f..adf830e1f93b6 100644 --- a/src/runtime_functions.js +++ b/src/runtime_functions.js @@ -4,10 +4,10 @@ * SPDX-License-Identifier: MIT */ -#if !WASM_BACKEND && EMULATED_FUNCTION_POINTERS == 0 +#if !WASM_BACKEND var jsCallStartIndex = 1; var functionPointers = new Array({{{ RESERVED_FUNCTION_POINTERS }}}); -#endif // !WASM_BACKEND && EMULATED_FUNCTION_POINTERS == 0 +#endif // !WASM_BACKEND #if WASM // Wraps a JS function as a wasm function with a given signature. @@ -197,7 +197,6 @@ function addFunction(func, sig) { return addFunctionWasm(func, sig); #else -#if EMULATED_FUNCTION_POINTERS == 0 var base = 0; for (var i = base; i < base + {{{ RESERVED_FUNCTION_POINTERS }}}; i++) { if (!functionPointers[i]) { @@ -207,24 +206,6 @@ function addFunction(func, sig) { } throw 'Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.'; -#else // EMULATED_FUNCTION_POINTERS == 0 - -#if WASM - return addFunctionWasm(func, sig); -#else - alignFunctionTables(); // TODO: we should rely on this being an invariant - var tables = getFunctionTables(); - var ret = -1; - for (var signature in tables) { - var table = tables[signature]; - if (ret < 0) ret = table.length; - else assert(ret === table.length); - table.push(func); - } - return ret; -#endif // WASM - -#endif // EMULATED_FUNCTION_POINTERS == 0 #endif // WASM_BACKEND } @@ -232,20 +213,6 @@ function removeFunction(index) { #if WASM_BACKEND removeFunctionWasm(index); #else - -#if EMULATED_FUNCTION_POINTERS == 0 functionPointers[index-jsCallStartIndex] = null; -#else -#if WASM - removeFunctionWasm(index); -#else - alignFunctionTables(); // XXX we should rely on this being an invariant - var tables = getFunctionTables(); - for (var sig in tables) { - tables[sig][index] = null; - } -#endif // WASM - -#endif // EMULATE_FUNCTION_POINTER_CASTS == 0 #endif // WASM_BACKEND } diff --git a/src/settings.js b/src/settings.js index e2d4999183c2b..0d42448191510 100644 --- a/src/settings.js +++ b/src/settings.js @@ -336,8 +336,7 @@ var SAFE_HEAP = 0; var SAFE_HEAP_LOG = 0; // In asm.js mode, we cannot simply add function pointers to function tables, so -// we reserve some slots for them. An alternative to this is to use -// EMULATED_FUNCTION_POINTERS, in which case we don't need to reserve. +// we reserve some slots for them. // [fastcomp-only] var RESERVED_FUNCTION_POINTERS = 0; @@ -347,27 +346,6 @@ var RESERVED_FUNCTION_POINTERS = 0; // [fastcomp-only] var ALIASING_FUNCTION_POINTERS = 0; -// asm.js: By default we implement function pointers using asm.js function -// tables, which is very fast. With this option, we implement them more flexibly -// by emulating them: we call out into JS, which handles the function tables. -// 1: Full emulation. This means you can modify the -// table in JS fully dynamically, not just add to -// the end. -// 2: Optimized emulation. Assumes once something is -// added to the table, it will not change. This allows -// dynamic linking while keeping performance fast, -// as we can do a fast call into the internal table -// if the fp is in the right range. Shared modules -// (MAIN_MODULE, SIDE_MODULE) do this by default. -// This requires RELOCATABLE to be set. -// wasm: -// By default we use a wasm Table for function pointers, which is fast and -// efficient. When enabling emulation, we also use the Table *outside* the wasm -// module, exactly as when emulating in asm.js, just replacing the plain JS -// array with a Table. -// [fastcomp-only] -var EMULATED_FUNCTION_POINTERS = 0; - // Allows function pointers to be cast, wraps each call of an incorrect type // with a runtime correction. This adds overhead and should not be used // normally. It also forces ALIASING_FUNCTION_POINTERS to 0. Aside from making diff --git a/src/support.js b/src/support.js index 3902ef2664d05..77e39cc9a6cb7 100644 --- a/src/support.js +++ b/src/support.js @@ -617,65 +617,6 @@ Module['loadWebAssemblyModule'] = loadWebAssemblyModule; #endif // WASM #endif // RELOCATABLE -#if EMULATED_FUNCTION_POINTERS -#if WASM == 0 -/** @param {Object=} module */ -function getFunctionTables(module) { - if (!module) module = Module; - var tables = {}; - for (var t in module) { - if (/^FUNCTION_TABLE_.*/.test(t)) { - var table = module[t]; - if (typeof table === 'object') tables[t.substr('FUNCTION_TABLE_'.length)] = table; - } - } - return tables; -} - -/** @param {Object=} module */ -function alignFunctionTables(module) { - var tables = getFunctionTables(module); - var maxx = 0; - for (var sig in tables) { - maxx = Math.max(maxx, tables[sig].length); - } - assert(maxx >= 0); - for (var sig in tables) { - var table = tables[sig]; - while (table.length < maxx) table.push(0); - } - return maxx; -} -#endif // WASM == 0 - -#if RELOCATABLE -// register functions from a new module being loaded -function registerFunctions(sigs, newModule) { - sigs.forEach(function(sig) { - if (!Module['FUNCTION_TABLE_' + sig]) { - Module['FUNCTION_TABLE_' + sig] = []; - } - }); - var oldMaxx = alignFunctionTables(); // align the new tables we may have just added - var newMaxx = alignFunctionTables(newModule); - var maxx = oldMaxx + newMaxx; - sigs.forEach(function(sig) { - var newTable = newModule['FUNCTION_TABLE_' + sig]; - var oldTable = Module['FUNCTION_TABLE_' + sig]; - assert(newTable !== oldTable); - assert(oldTable.length === oldMaxx); - for (var i = 0; i < newTable.length; i++) { - oldTable.push(newTable[i]); - } - assert(oldTable.length === maxx); - }); - assert(maxx === alignFunctionTables()); // align the ones we didn't touch -} -// export this so side modules can use it -Module['registerFunctions'] = registerFunctions; -#endif // RELOCATABLE -#endif // EMULATED_FUNCTION_POINTERS - #include "runtime_functions.js" var funcWrappers = {}; diff --git a/tests/other/metadce/hello_libcxx_fastcomp_O2_EMULATED_FUNCTION_POINTERS.exports b/tests/other/metadce/hello_libcxx_fastcomp_O2_EMULATED_FUNCTION_POINTERS.exports deleted file mode 100644 index 7a6a0ee416816..0000000000000 --- a/tests/other/metadce/hello_libcxx_fastcomp_O2_EMULATED_FUNCTION_POINTERS.exports +++ /dev/null @@ -1,35 +0,0 @@ -__ZSt18uncaught_exceptionv -___errno_location -_emscripten_get_sbrk_ptr -_free -_main -_malloc -_memcpy -_memmove -_memset -dynCall_X -dynCall_ii -dynCall_iidiiii -dynCall_iii -dynCall_iiii -dynCall_iiiii -dynCall_iiiiid -dynCall_iiiiii -dynCall_iiiiiid -dynCall_iiiiiii -dynCall_iiiiiiii -dynCall_iiiiiiiii -dynCall_iiiiij -dynCall_jiji -dynCall_v -dynCall_vi -dynCall_vii -dynCall_viii -dynCall_viiii -dynCall_viiiii -dynCall_viiiiii -dynCall_viijii -globalCtors -stackAlloc -stackRestore -stackSave diff --git a/tests/other/metadce/hello_libcxx_fastcomp_O2_EMULATED_FUNCTION_POINTERS.funcs b/tests/other/metadce/hello_libcxx_fastcomp_O2_EMULATED_FUNCTION_POINTERS.funcs deleted file mode 100644 index 98913d28c9b09..0000000000000 --- a/tests/other/metadce/hello_libcxx_fastcomp_O2_EMULATED_FUNCTION_POINTERS.funcs +++ /dev/null @@ -1,527 +0,0 @@ -$__ZL8is_equalPKSt9type_infoS1_b -$__ZN10__cxxabiv112_GLOBAL__N_111GuardObjectINS0_17InitByteNoThreadsEE17cxa_guard_acquireEv -$__ZN10__cxxabiv112_GLOBAL__N_111GuardObjectINS0_17InitByteNoThreadsEE17cxa_guard_releaseEv -$__ZN10__cxxabiv112_GLOBAL__N_111GuardObjectINS0_17InitByteNoThreadsEEC2EPj -$__ZN10__cxxabiv112_GLOBAL__N_117InitByteNoThreads17acquire_init_byteEv -$__ZN10__cxxabiv112_GLOBAL__N_117InitByteNoThreadsCI2NS0_11GuardObjectIS1_EEEPj -$__ZN10__cxxabiv116__shim_type_infoD2Ev -$__ZN10__cxxabiv117__class_type_infoD0Ev -$__ZN12_GLOBAL__N_19AtomicIntIhEC2EPh -$__ZNK10__cxxabiv117__class_type_info16search_above_dstEPNS_19__dynamic_cast_infoEPKvS4_ib -$__ZNK10__cxxabiv117__class_type_info16search_below_dstEPNS_19__dynamic_cast_infoEPKvib -$__ZNK10__cxxabiv117__class_type_info24process_found_base_classEPNS_19__dynamic_cast_infoEPvi -$__ZNK10__cxxabiv117__class_type_info27has_unambiguous_public_baseEPNS_19__dynamic_cast_infoEPvi -$__ZNK10__cxxabiv117__class_type_info29process_static_type_above_dstEPNS_19__dynamic_cast_infoEPKvS4_i -$__ZNK10__cxxabiv117__class_type_info29process_static_type_below_dstEPNS_19__dynamic_cast_infoEPKvi -$__ZNK10__cxxabiv117__class_type_info9can_catchEPKNS_16__shim_type_infoERPv -$__ZNK10__cxxabiv120__si_class_type_info16search_above_dstEPNS_19__dynamic_cast_infoEPKvS4_ib -$__ZNK10__cxxabiv120__si_class_type_info16search_below_dstEPNS_19__dynamic_cast_infoEPKvib -$__ZNK10__cxxabiv120__si_class_type_info27has_unambiguous_public_baseEPNS_19__dynamic_cast_infoEPvi -$__ZNK10__cxxabiv121__vmi_class_type_info16search_above_dstEPNS_19__dynamic_cast_infoEPKvS4_ib -$__ZNK10__cxxabiv121__vmi_class_type_info16search_below_dstEPNS_19__dynamic_cast_infoEPKvib -$__ZNK10__cxxabiv121__vmi_class_type_info27has_unambiguous_public_baseEPNS_19__dynamic_cast_infoEPvi -$__ZNK10__cxxabiv122__base_class_type_info16search_above_dstEPNS_19__dynamic_cast_infoEPKvS4_ib -$__ZNK10__cxxabiv122__base_class_type_info16search_below_dstEPNS_19__dynamic_cast_infoEPKvib -$__ZNK10__cxxabiv122__base_class_type_info27has_unambiguous_public_baseEPNS_19__dynamic_cast_infoEPvi -$__ZNKSt3__210__time_put8__do_putEPcRS1_PK2tmcc -$__ZNKSt3__210__time_put8__do_putEPwRS1_PK2tmcc -$__ZNKSt3__210moneypunctIcLb0EE11do_groupingEv -$__ZNKSt3__210moneypunctIcLb0EE13do_pos_formatEv -$__ZNKSt3__210moneypunctIcLb0EE16do_decimal_pointEv -$__ZNKSt3__210moneypunctIcLb0EE16do_negative_signEv -$__ZNKSt3__210moneypunctIwLb0EE16do_decimal_pointEv -$__ZNKSt3__210moneypunctIwLb0EE16do_negative_signEv -$__ZNKSt3__212_GLOBAL__N_111__fake_bindclEv -$__ZNKSt3__220__time_get_c_storageIcE3__XEv -$__ZNKSt3__220__time_get_c_storageIcE3__cEv -$__ZNKSt3__220__time_get_c_storageIcE3__rEv -$__ZNKSt3__220__time_get_c_storageIcE3__xEv -$__ZNKSt3__220__time_get_c_storageIcE7__am_pmEv -$__ZNKSt3__220__time_get_c_storageIcE7__weeksEv -$__ZNKSt3__220__time_get_c_storageIcE8__monthsEv -$__ZNKSt3__220__time_get_c_storageIwE3__XEv -$__ZNKSt3__220__time_get_c_storageIwE3__cEv -$__ZNKSt3__220__time_get_c_storageIwE3__rEv -$__ZNKSt3__220__time_get_c_storageIwE3__xEv -$__ZNKSt3__220__time_get_c_storageIwE7__am_pmEv -$__ZNKSt3__220__time_get_c_storageIwE7__weeksEv -$__ZNKSt3__220__time_get_c_storageIwE8__monthsEv -$__ZNKSt3__25ctypeIcE10do_tolowerEPcPKc -$__ZNKSt3__25ctypeIcE10do_tolowerEc -$__ZNKSt3__25ctypeIcE10do_toupperEPcPKc -$__ZNKSt3__25ctypeIcE10do_toupperEc -$__ZNKSt3__25ctypeIcE8do_widenEPKcS3_Pc -$__ZNKSt3__25ctypeIcE8do_widenEc -$__ZNKSt3__25ctypeIcE9do_narrowEPKcS3_cPc -$__ZNKSt3__25ctypeIcE9do_narrowEcc -$__ZNKSt3__25ctypeIwE10do_scan_isEtPKwS3_ -$__ZNKSt3__25ctypeIwE10do_tolowerEPwPKw -$__ZNKSt3__25ctypeIwE10do_tolowerEw -$__ZNKSt3__25ctypeIwE10do_toupperEPwPKw -$__ZNKSt3__25ctypeIwE10do_toupperEw -$__ZNKSt3__25ctypeIwE11do_scan_notEtPKwS3_ -$__ZNKSt3__25ctypeIwE5do_isEPKwS3_Pt -$__ZNKSt3__25ctypeIwE5do_isEtw -$__ZNKSt3__25ctypeIwE8do_widenEPKcS3_Pw -$__ZNKSt3__25ctypeIwE8do_widenEc -$__ZNKSt3__25ctypeIwE9do_narrowEPKwS3_cPc -$__ZNKSt3__25ctypeIwE9do_narrowEwc -$__ZNKSt3__26locale5__imp9has_facetEl -$__ZNKSt3__26locale5__imp9use_facetEl -$__ZNKSt3__26locale9use_facetERNS0_2idE -$__ZNKSt3__27codecvtIDic11__mbstate_tE10do_unshiftERS1_PcS4_RS4_ -$__ZNKSt3__27codecvtIDic11__mbstate_tE13do_max_lengthEv -$__ZNKSt3__27codecvtIDic11__mbstate_tE5do_inERS1_PKcS5_RS5_PDiS7_RS7_ -$__ZNKSt3__27codecvtIDic11__mbstate_tE6do_outERS1_PKDiS5_RS5_PcS7_RS7_ -$__ZNKSt3__27codecvtIDic11__mbstate_tE9do_lengthERS1_PKcS5_m -$__ZNKSt3__27codecvtIDsc11__mbstate_tE5do_inERS1_PKcS5_RS5_PDsS7_RS7_ -$__ZNKSt3__27codecvtIDsc11__mbstate_tE6do_outERS1_PKDsS5_RS5_PcS7_RS7_ -$__ZNKSt3__27codecvtIDsc11__mbstate_tE9do_lengthERS1_PKcS5_m -$__ZNKSt3__27codecvtIcc11__mbstate_tE11do_encodingEv -$__ZNKSt3__27codecvtIcc11__mbstate_tE6do_outERS1_PKcS5_RS5_PcS7_RS7_ -$__ZNKSt3__27codecvtIcc11__mbstate_tE9do_lengthERS1_PKcS5_m -$__ZNKSt3__27codecvtIwc11__mbstate_tE10do_unshiftERS1_PcS4_RS4_ -$__ZNKSt3__27codecvtIwc11__mbstate_tE11do_encodingEv -$__ZNKSt3__27codecvtIwc11__mbstate_tE13do_max_lengthEv -$__ZNKSt3__27codecvtIwc11__mbstate_tE5do_inERS1_PKcS5_RS5_PwS7_RS7_ -$__ZNKSt3__27codecvtIwc11__mbstate_tE6do_outERS1_PKwS5_RS5_PcS7_RS7_ -$__ZNKSt3__27codecvtIwc11__mbstate_tE9do_lengthERS1_PKcS5_m -$__ZNKSt3__27collateIcE10do_compareEPKcS3_S3_S3_ -$__ZNKSt3__27collateIcE12do_transformEPKcS3_ -$__ZNKSt3__27collateIcE7do_hashEPKcS3_ -$__ZNKSt3__27collateIwE10do_compareEPKwS3_S3_S3_ -$__ZNKSt3__27collateIwE12do_transformEPKwS3_ -$__ZNKSt3__27collateIwE7do_hashEPKwS3_ -$__ZNKSt3__27num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE15__do_get_signedIlEES4_S4_S4_RNS_8ios_baseERjRT_ -$__ZNKSt3__27num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE15__do_get_signedIxEES4_S4_S4_RNS_8ios_baseERjRT_ -$__ZNKSt3__27num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE17__do_get_unsignedImEES4_S4_S4_RNS_8ios_baseERjRT_ -$__ZNKSt3__27num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE17__do_get_unsignedItEES4_S4_S4_RNS_8ios_baseERjRT_ -$__ZNKSt3__27num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE17__do_get_unsignedIyEES4_S4_S4_RNS_8ios_baseERjRT_ -$__ZNKSt3__27num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE23__do_get_floating_pointIdEES4_S4_S4_RNS_8ios_baseERjRT_ -$__ZNKSt3__27num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE23__do_get_floating_pointIeEES4_S4_S4_RNS_8ios_baseERjRT_ -$__ZNKSt3__27num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE23__do_get_floating_pointIfEES4_S4_S4_RNS_8ios_baseERjRT_ -$__ZNKSt3__27num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_RNS_8ios_baseERjRPv -$__ZNKSt3__27num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_RNS_8ios_baseERjRb -$__ZNKSt3__27num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_RNS_8ios_baseERjRd -$__ZNKSt3__27num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_RNS_8ios_baseERjRe -$__ZNKSt3__27num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_RNS_8ios_baseERjRf -$__ZNKSt3__27num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_RNS_8ios_baseERjRl -$__ZNKSt3__27num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_RNS_8ios_baseERjRt -$__ZNKSt3__27num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_RNS_8ios_baseERjRx -$__ZNKSt3__27num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_RNS_8ios_baseERjRy -$__ZNKSt3__27num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_RNS_8ios_baseERjS8_ -$__ZNKSt3__27num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE15__do_get_signedIlEES4_S4_S4_RNS_8ios_baseERjRT_ -$__ZNKSt3__27num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE15__do_get_signedIxEES4_S4_S4_RNS_8ios_baseERjRT_ -$__ZNKSt3__27num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE17__do_get_unsignedImEES4_S4_S4_RNS_8ios_baseERjRT_ -$__ZNKSt3__27num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE17__do_get_unsignedItEES4_S4_S4_RNS_8ios_baseERjRT_ -$__ZNKSt3__27num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE17__do_get_unsignedIyEES4_S4_S4_RNS_8ios_baseERjRT_ -$__ZNKSt3__27num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE23__do_get_floating_pointIdEES4_S4_S4_RNS_8ios_baseERjRT_ -$__ZNKSt3__27num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE23__do_get_floating_pointIeEES4_S4_S4_RNS_8ios_baseERjRT_ -$__ZNKSt3__27num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE23__do_get_floating_pointIfEES4_S4_S4_RNS_8ios_baseERjRT_ -$__ZNKSt3__27num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_RNS_8ios_baseERjRPv -$__ZNKSt3__27num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_RNS_8ios_baseERjRb -$__ZNKSt3__27num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_RNS_8ios_baseERjRd -$__ZNKSt3__27num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_RNS_8ios_baseERjRe -$__ZNKSt3__27num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_RNS_8ios_baseERjRf -$__ZNKSt3__27num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_RNS_8ios_baseERjRl -$__ZNKSt3__27num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_RNS_8ios_baseERjRt -$__ZNKSt3__27num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_RNS_8ios_baseERjRx -$__ZNKSt3__27num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_RNS_8ios_baseERjRy -$__ZNKSt3__27num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_RNS_8ios_baseERjS8_ -$__ZNKSt3__27num_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_putES4_RNS_8ios_baseEcPKv -$__ZNKSt3__27num_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_putES4_RNS_8ios_baseEcb -$__ZNKSt3__27num_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_putES4_RNS_8ios_baseEcd -$__ZNKSt3__27num_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_putES4_RNS_8ios_baseEce -$__ZNKSt3__27num_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_putES4_RNS_8ios_baseEcl -$__ZNKSt3__27num_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_putES4_RNS_8ios_baseEcm -$__ZNKSt3__27num_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_putES4_RNS_8ios_baseEcx -$__ZNKSt3__27num_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_putES4_RNS_8ios_baseEcy -$__ZNKSt3__27num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4_RNS_8ios_baseEwPKv -$__ZNKSt3__27num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4_RNS_8ios_baseEwb -$__ZNKSt3__27num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4_RNS_8ios_baseEwd -$__ZNKSt3__27num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4_RNS_8ios_baseEwe -$__ZNKSt3__27num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4_RNS_8ios_baseEwl -$__ZNKSt3__27num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4_RNS_8ios_baseEwm -$__ZNKSt3__27num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4_RNS_8ios_baseEwx -$__ZNKSt3__27num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4_RNS_8ios_baseEwy -$__ZNKSt3__28ios_base6getlocEv -$__ZNKSt3__28messagesIcE6do_getEliiRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE -$__ZNKSt3__28messagesIcE7do_openERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERKNS_6localeE -$__ZNKSt3__28messagesIwE6do_getEliiRKNS_12basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEE -$__ZNKSt3__28numpunctIcE11do_groupingEv -$__ZNKSt3__28numpunctIcE11do_truenameEv -$__ZNKSt3__28numpunctIcE12do_falsenameEv -$__ZNKSt3__28numpunctIcE16do_decimal_pointEv -$__ZNKSt3__28numpunctIcE16do_thousands_sepEv -$__ZNKSt3__28numpunctIwE11do_groupingEv -$__ZNKSt3__28numpunctIwE11do_truenameEv -$__ZNKSt3__28numpunctIwE12do_falsenameEv -$__ZNKSt3__28numpunctIwE16do_decimal_pointEv -$__ZNKSt3__28numpunctIwE16do_thousands_sepEv -$__ZNKSt3__28time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE10__get_hourERiRS4_S4_RjRKNS_5ctypeIcEE -$__ZNKSt3__28time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE10__get_yearERiRS4_S4_RjRKNS_5ctypeIcEE -$__ZNKSt3__28time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE11__get_am_pmERiRS4_S4_RjRKNS_5ctypeIcEE -$__ZNKSt3__28time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE11__get_monthERiRS4_S4_RjRKNS_5ctypeIcEE -$__ZNKSt3__28time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE11__get_year4ERiRS4_S4_RjRKNS_5ctypeIcEE -$__ZNKSt3__28time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE11do_get_dateES4_S4_RNS_8ios_baseERjP2tm -$__ZNKSt3__28time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE11do_get_timeES4_S4_RNS_8ios_baseERjP2tm -$__ZNKSt3__28time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE11do_get_yearES4_S4_RNS_8ios_baseERjP2tm -$__ZNKSt3__28time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE12__get_minuteERiRS4_S4_RjRKNS_5ctypeIcEE -$__ZNKSt3__28time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE12__get_secondERiRS4_S4_RjRKNS_5ctypeIcEE -$__ZNKSt3__28time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE13__get_12_hourERiRS4_S4_RjRKNS_5ctypeIcEE -$__ZNKSt3__28time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE13__get_percentERS4_S4_RjRKNS_5ctypeIcEE -$__ZNKSt3__28time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE13__get_weekdayERiRS4_S4_RjRKNS_5ctypeIcEE -$__ZNKSt3__28time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE13do_date_orderEv -$__ZNKSt3__28time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE14do_get_weekdayES4_S4_RNS_8ios_baseERjP2tm -$__ZNKSt3__28time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE15__get_monthnameERiRS4_S4_RjRKNS_5ctypeIcEE -$__ZNKSt3__28time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE16do_get_monthnameES4_S4_RNS_8ios_baseERjP2tm -$__ZNKSt3__28time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE17__get_weekdaynameERiRS4_S4_RjRKNS_5ctypeIcEE -$__ZNKSt3__28time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE17__get_white_spaceERS4_S4_RjRKNS_5ctypeIcEE -$__ZNKSt3__28time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE18__get_day_year_numERiRS4_S4_RjRKNS_5ctypeIcEE -$__ZNKSt3__28time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE3getES4_S4_RNS_8ios_baseERjP2tmPKcSC_ -$__ZNKSt3__28time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_RNS_8ios_baseERjP2tmcc -$__ZNKSt3__28time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE9__get_dayERiRS4_S4_RjRKNS_5ctypeIcEE -$__ZNKSt3__28time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE10__get_hourERiRS4_S4_RjRKNS_5ctypeIwEE -$__ZNKSt3__28time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE10__get_yearERiRS4_S4_RjRKNS_5ctypeIwEE -$__ZNKSt3__28time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE11__get_am_pmERiRS4_S4_RjRKNS_5ctypeIwEE -$__ZNKSt3__28time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE11__get_monthERiRS4_S4_RjRKNS_5ctypeIwEE -$__ZNKSt3__28time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE11__get_year4ERiRS4_S4_RjRKNS_5ctypeIwEE -$__ZNKSt3__28time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE11do_get_dateES4_S4_RNS_8ios_baseERjP2tm -$__ZNKSt3__28time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE11do_get_timeES4_S4_RNS_8ios_baseERjP2tm -$__ZNKSt3__28time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE11do_get_yearES4_S4_RNS_8ios_baseERjP2tm -$__ZNKSt3__28time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE12__get_minuteERiRS4_S4_RjRKNS_5ctypeIwEE -$__ZNKSt3__28time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE12__get_secondERiRS4_S4_RjRKNS_5ctypeIwEE -$__ZNKSt3__28time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE13__get_12_hourERiRS4_S4_RjRKNS_5ctypeIwEE -$__ZNKSt3__28time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE13__get_percentERS4_S4_RjRKNS_5ctypeIwEE -$__ZNKSt3__28time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE13__get_weekdayERiRS4_S4_RjRKNS_5ctypeIwEE -$__ZNKSt3__28time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE14do_get_weekdayES4_S4_RNS_8ios_baseERjP2tm -$__ZNKSt3__28time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE15__get_monthnameERiRS4_S4_RjRKNS_5ctypeIwEE -$__ZNKSt3__28time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE16do_get_monthnameES4_S4_RNS_8ios_baseERjP2tm -$__ZNKSt3__28time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE17__get_weekdaynameERiRS4_S4_RjRKNS_5ctypeIwEE -$__ZNKSt3__28time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE17__get_white_spaceERS4_S4_RjRKNS_5ctypeIwEE -$__ZNKSt3__28time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE18__get_day_year_numERiRS4_S4_RjRKNS_5ctypeIwEE -$__ZNKSt3__28time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE3getES4_S4_RNS_8ios_baseERjP2tmPKwSC_ -$__ZNKSt3__28time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_RNS_8ios_baseERjP2tmcc -$__ZNKSt3__28time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE9__get_dayERiRS4_S4_RjRKNS_5ctypeIwEE -$__ZNKSt3__28time_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_putES4_RNS_8ios_baseEcPK2tmcc -$__ZNKSt3__28time_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4_RNS_8ios_baseEwPK2tmcc -$__ZNKSt3__29__num_getIwE10__do_widenERNS_8ios_baseEPw -$__ZNKSt3__29__num_getIwE12__do_widen_pIwEEPKT_RNS_8ios_baseEPS3_ -$__ZNKSt3__29money_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_bRNS_8ios_baseERjRNS_12basic_stringIcS3_NS_9allocatorIcEEEE -$__ZNKSt3__29money_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_bRNS_8ios_baseERjRe -$__ZNKSt3__29money_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_bRNS_8ios_baseERjRNS_12basic_stringIwS3_NS_9allocatorIwEEEE -$__ZNKSt3__29money_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_bRNS_8ios_baseERjRe -$__ZNKSt3__29money_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_putES4_bRNS_8ios_baseEcRKNS_12basic_stringIcS3_NS_9allocatorIcEEEE -$__ZNKSt3__29money_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_putES4_bRNS_8ios_baseEce -$__ZNKSt3__29money_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4_bRNS_8ios_baseEwRKNS_12basic_stringIwS3_NS_9allocatorIwEEEE -$__ZNKSt3__29money_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4_bRNS_8ios_baseEwe -$__ZNSt3__210__stdinbufIcE5imbueERKNS_6localeE -$__ZNSt3__210__stdinbufIcE5uflowEv -$__ZNSt3__210__stdinbufIcE9__getcharEb -$__ZNSt3__210__stdinbufIcE9pbackfailEi -$__ZNSt3__210__stdinbufIcE9underflowEv -$__ZNSt3__210__stdinbufIcEC2EP8_IO_FILEP11__mbstate_t -$__ZNSt3__210__stdinbufIwE5imbueERKNS_6localeE -$__ZNSt3__210__stdinbufIwE5uflowEv -$__ZNSt3__210__stdinbufIwE9__getcharEb -$__ZNSt3__210__stdinbufIwE9pbackfailEj -$__ZNSt3__210__stdinbufIwE9underflowEv -$__ZNSt3__210__stdinbufIwEC2EP8_IO_FILEP11__mbstate_t -$__ZNSt3__210__time_putD2Ev -$__ZNSt3__211__call_onceERVmPvPFvS2_E -$__ZNSt3__211__money_getIcE13__gather_infoEbRKNS_6localeERNS_10money_base7patternERcS8_RNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEESF_SF_SF_Ri -$__ZNSt3__211__money_getIwE13__gather_infoEbRKNS_6localeERNS_10money_base7patternERwS8_RNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS9_IwNSA_IwEENSC_IwEEEESJ_SJ_Ri -$__ZNSt3__211__money_putIcE13__gather_infoEbbRKNS_6localeERNS_10money_base7patternERcS8_RNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEESF_SF_Ri -$__ZNSt3__211__money_putIcE8__formatEPcRS2_S3_jPKcS5_RKNS_5ctypeIcEEbRKNS_10money_base7patternEccRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEESL_SL_i -$__ZNSt3__211__money_putIwE13__gather_infoEbbRKNS_6localeERNS_10money_base7patternERwS8_RNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS9_IwNSA_IwEENSC_IwEEEESJ_Ri -$__ZNSt3__211__money_putIwE8__formatEPwRS2_S3_jPKwS5_RKNS_5ctypeIwEEbRKNS_10money_base7patternEwwRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERKNSE_IwNSF_IwEENSH_IwEEEESQ_i -$__ZNSt3__211__stdoutbufIcE5imbueERKNS_6localeE -$__ZNSt3__211__stdoutbufIcE6xsputnEPKcl -$__ZNSt3__211__stdoutbufIcE8overflowEi -$__ZNSt3__211__stdoutbufIcEC2EP8_IO_FILEP11__mbstate_t -$__ZNSt3__211__stdoutbufIwE4syncEv -$__ZNSt3__211__stdoutbufIwE5imbueERKNS_6localeE -$__ZNSt3__211__stdoutbufIwE6xsputnEPKwl -$__ZNSt3__211__stdoutbufIwE8overflowEj -$__ZNSt3__211__stdoutbufIwEC2EP8_IO_FILEP11__mbstate_t -$__ZNSt3__211char_traitsIcE11eq_int_typeEii -$__ZNSt3__211char_traitsIcE11to_int_typeEc -$__ZNSt3__211char_traitsIcE4copyEPcPKcm -$__ZNSt3__211char_traitsIcE6assignEPcmc -$__ZNSt3__211char_traitsIcE6assignERcRKc -$__ZNSt3__211char_traitsIwE4copyEPwPKwm -$__ZNSt3__211char_traitsIwE6assignERwRKw -$__ZNSt3__212_GLOBAL__N_111__fake_bindC2EMNS_6locale2idEFvvEPS3_ -$__ZNSt3__212basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE21__grow_by_and_replaceEmmmmmmPKc -$__ZNSt3__212basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE23__append_forward_unsafeIPcEERS5_T_S9_ -$__ZNSt3__212basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcm -$__ZNSt3__212basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEmc -$__ZNSt3__212basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initIPKcEENS_9enable_ifIXsr27__is_cpp17_forward_iteratorIT_EE5valueEvE4typeESA_SA_ -$__ZNSt3__212basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6appendEPKcm -$__ZNSt3__212basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6appendEmc -$__ZNSt3__212basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6assignEPKc -$__ZNSt3__212basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6assignEPKcm -$__ZNSt3__212basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6resizeEmc -$__ZNSt3__212basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9__grow_byEmmmmmm -$__ZNSt3__212basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9push_backEc -$__ZNSt3__212basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2ERKS5_ -$__ZNSt3__212basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev -$__ZNSt3__212basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE21__grow_by_and_replaceEmmmmmmPKw -$__ZNSt3__212basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE23__append_forward_unsafeIPwEERS5_T_S9_ -$__ZNSt3__212basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6__initEPKwm -$__ZNSt3__212basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6__initEmw -$__ZNSt3__212basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6__initIPKwEENS_9enable_ifIXsr27__is_cpp17_forward_iteratorIT_EE5valueEvE4typeESA_SA_ -$__ZNSt3__212basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6appendEPKwm -$__ZNSt3__212basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6assignEPKw -$__ZNSt3__212basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6assignEPKwm -$__ZNSt3__212basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE9__grow_byEmmmmmm -$__ZNSt3__212basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE9push_backEw -$__ZNSt3__212basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEED2Ev -$__ZNSt3__213__vector_baseIPNS_6locale5facetENS_15__sso_allocatorIS3_Lm28EEEED2Ev -$__ZNSt3__213basic_istreamIcNS_11char_traitsIcEEED0Ev -$__ZNSt3__213basic_istreamIcNS_11char_traitsIcEEED1Ev -$__ZNSt3__213basic_ostreamIcNS_11char_traitsIcEEE3putEc -$__ZNSt3__213basic_ostreamIcNS_11char_traitsIcEEE5flushEv -$__ZNSt3__213basic_ostreamIcNS_11char_traitsIcEEE6sentryC2ERS3_ -$__ZNSt3__213basic_ostreamIcNS_11char_traitsIcEEE6sentryD2Ev -$__ZNSt3__213basic_ostreamIcNS_11char_traitsIcEEED0Ev -$__ZNSt3__213basic_ostreamIcNS_11char_traitsIcEEED1Ev -$__ZNSt3__214__num_get_base10__get_baseERNS_8ios_baseE -$__ZNSt3__214__num_put_base12__format_intEPcPKcbj -$__ZNSt3__214__num_put_base14__format_floatEPcPKcj -$__ZNSt3__214__num_put_base18__identify_paddingEPcS1_RKNS_8ios_baseE -$__ZNSt3__214__scan_keywordINS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEPKNS_12basic_stringIcS3_NS_9allocatorIcEEEENS_5ctypeIcEEEET0_RT_SE_SD_SD_RKT1_Rjb -$__ZNSt3__214__scan_keywordINS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEPKNS_12basic_stringIwS3_NS_9allocatorIwEEEENS_5ctypeIwEEEET0_RT_SE_SD_SD_RKT1_Rjb -$__ZNSt3__214__split_bufferIPNS_6locale5facetERNS_15__sso_allocatorIS3_Lm28EEEE18__construct_at_endEm -$__ZNSt3__214__split_bufferIPNS_6locale5facetERNS_15__sso_allocatorIS3_Lm28EEEE21_ConstructTransactionC2EPPS3_m -$__ZNSt3__214__split_bufferIPNS_6locale5facetERNS_15__sso_allocatorIS3_Lm28EEEEC2EmmS6_ -$__ZNSt3__214__split_bufferIPNS_6locale5facetERNS_15__sso_allocatorIS3_Lm28EEEED2Ev -$__ZNSt3__215__num_get_floatIdEET_PKcS3_Rj -$__ZNSt3__215__num_get_floatIeEET_PKcS3_Rj -$__ZNSt3__215__num_get_floatIfEET_PKcS3_Rj -$__ZNSt3__215basic_streambufIcNS_11char_traitsIcEEE5imbueERKNS_6localeE -$__ZNSt3__215basic_streambufIcNS_11char_traitsIcEEE5uflowEv -$__ZNSt3__215basic_streambufIcNS_11char_traitsIcEEE6setbufEPcl -$__ZNSt3__215basic_streambufIcNS_11char_traitsIcEEE6xsgetnEPcl -$__ZNSt3__215basic_streambufIcNS_11char_traitsIcEEE6xsputnEPKcl -$__ZNSt3__215basic_streambufIcNS_11char_traitsIcEEE7seekoffExNS_8ios_base7seekdirEj -$__ZNSt3__215basic_streambufIcNS_11char_traitsIcEEE7seekposENS_4fposI11__mbstate_tEEj -$__ZNSt3__215basic_streambufIcNS_11char_traitsIcEEE9pbackfailEi -$__ZNSt3__215basic_streambufIcNS_11char_traitsIcEEE9underflowEv -$__ZNSt3__215basic_streambufIcNS_11char_traitsIcEEEC2Ev -$__ZNSt3__215basic_streambufIcNS_11char_traitsIcEEED0Ev -$__ZNSt3__215basic_streambufIcNS_11char_traitsIcEEED2Ev -$__ZNSt3__215basic_streambufIwNS_11char_traitsIwEEE5uflowEv -$__ZNSt3__215basic_streambufIwNS_11char_traitsIwEEE6xsgetnEPwl -$__ZNSt3__215basic_streambufIwNS_11char_traitsIwEEE6xsputnEPKwl -$__ZNSt3__215basic_streambufIwNS_11char_traitsIwEEEC2Ev -$__ZNSt3__215basic_streambufIwNS_11char_traitsIwEEED0Ev -$__ZNSt3__215basic_streambufIwNS_11char_traitsIwEEED2Ev -$__ZNSt3__216__check_groupingERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPjS8_Rj -$__ZNSt3__216__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4_ -$__ZNSt3__216__pad_and_outputIwNS_11char_traitsIwEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4_ -$__ZNSt3__217__call_once_proxyINS_5tupleIJONS_12_GLOBAL__N_111__fake_bindEEEEEEvPv -$__ZNSt3__217__libcpp_sscanf_lEPKcP15__locale_structS1_z -$__ZNSt3__219__double_or_nothingIcEEvRNS_10unique_ptrIT_PFvPvEEERPS2_S9_ -$__ZNSt3__219__double_or_nothingIjEEvRNS_10unique_ptrIT_PFvPvEEERPS2_S9_ -$__ZNSt3__219__libcpp_asprintf_lEPPcP15__locale_structPKcz -$__ZNSt3__219__libcpp_snprintf_lEPcmP15__locale_structPKcz -$__ZNSt3__220__get_up_to_n_digitsIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEEEiRT0_S5_RjRKNS_5ctypeIT_EEi -$__ZNSt3__220__get_up_to_n_digitsIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEEEiRT0_S5_RjRKNS_5ctypeIT_EEi -$__ZNSt3__224__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m -$__ZNSt3__225__num_get_signed_integralIlEET_PKcS3_Rji -$__ZNSt3__225__num_get_signed_integralIxEET_PKcS3_Rji -$__ZNSt3__227__num_get_unsigned_integralImEET_PKcS3_Rji -$__ZNSt3__227__num_get_unsigned_integralItEET_PKcS3_Rji -$__ZNSt3__227__num_get_unsigned_integralIyEET_PKcS3_Rji -$__ZNSt3__25ctypeIcEC2EPKtbm -$__ZNSt3__25ctypeIcED0Ev -$__ZNSt3__25ctypeIcED2Ev -$__ZNSt3__26__clocEv -$__ZNSt3__26locale2id5__getEv -$__ZNSt3__26locale2id6__initEv -$__ZNSt3__26locale5__imp7installEPNS0_5facetEl -$__ZNSt3__26locale5__impC2Em -$__ZNSt3__26locale5__impD0Ev -$__ZNSt3__26locale5__impD2Ev -$__ZNSt3__26locale5facet16__on_zero_sharedEv -$__ZNSt3__26locale7classicEv -$__ZNSt3__26locale8__globalEv -$__ZNSt3__26localeC2ERKS0_ -$__ZNSt3__26localeC2Ev -$__ZNSt3__26localeD2Ev -$__ZNSt3__26vectorIPNS_6locale5facetENS_15__sso_allocatorIS3_Lm28EEEE11__vallocateEm -$__ZNSt3__26vectorIPNS_6locale5facetENS_15__sso_allocatorIS3_Lm28EEEE18__construct_at_endEm -$__ZNSt3__26vectorIPNS_6locale5facetENS_15__sso_allocatorIS3_Lm28EEEE21_ConstructTransactionC2ERS6_m -$__ZNSt3__26vectorIPNS_6locale5facetENS_15__sso_allocatorIS3_Lm28EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE -$__ZNSt3__26vectorIPNS_6locale5facetENS_15__sso_allocatorIS3_Lm28EEEE6resizeEm -$__ZNSt3__26vectorIPNS_6locale5facetENS_15__sso_allocatorIS3_Lm28EEEE8__appendEm -$__ZNSt3__26vectorIPNS_6locale5facetENS_15__sso_allocatorIS3_Lm28EEEEC2Em -$__ZNSt3__27codecvtIwc11__mbstate_tED0Ev -$__ZNSt3__27codecvtIwc11__mbstate_tED2Ev -$__ZNSt3__28ios_base16__call_callbacksENS0_5eventE -$__ZNSt3__28ios_base4initEPv -$__ZNSt3__28ios_base5clearEj -$__ZNSt3__28ios_baseD0Ev -$__ZNSt3__28ios_baseD2Ev -$__ZNSt3__28numpunctIcEC2Em -$__ZNSt3__28numpunctIcED0Ev -$__ZNSt3__28numpunctIcED2Ev -$__ZNSt3__28numpunctIwEC2Em -$__ZNSt3__28numpunctIwED0Ev -$__ZNSt3__28numpunctIwED2Ev -$__ZNSt3__28time_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEED0Ev -$__ZNSt3__28time_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEED2Ev -$__ZNSt3__29DoIOSInitC2Ev -$__ZNSt3__29__num_getIcE17__stage2_int_loopEciPcRS2_RjcRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPjRSD_PKc -$__ZNSt3__29__num_getIcE17__stage2_int_prepERNS_8ios_baseERc -$__ZNSt3__29__num_getIcE19__stage2_float_loopEcRbRcPcRS4_ccRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPjRSE_RjS4_ -$__ZNSt3__29__num_getIcE19__stage2_float_prepERNS_8ios_baseEPcRcS5_ -$__ZNSt3__29__num_getIwE17__stage2_int_loopEwiPcRS2_RjwRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPjRSD_PKw -$__ZNSt3__29__num_getIwE17__stage2_int_prepERNS_8ios_baseERw -$__ZNSt3__29__num_getIwE19__stage2_float_loopEwRbRcPcRS4_wwRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPjRSE_RjPw -$__ZNSt3__29__num_getIwE19__stage2_float_prepERNS_8ios_baseEPwRwS5_ -$__ZNSt3__29__num_putIcE21__widen_and_group_intEPcS2_S2_S2_RS2_S3_RKNS_6localeE -$__ZNSt3__29__num_putIcE23__widen_and_group_floatEPcS2_S2_S2_RS2_S3_RKNS_6localeE -$__ZNSt3__29__num_putIwE21__widen_and_group_intEPcS2_S2_PwRS3_S4_RKNS_6localeE -$__ZNSt3__29__num_putIwE23__widen_and_group_floatEPcS2_S2_PwRS3_S4_RKNS_6localeE -$__ZNSt3__29money_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE8__do_getERS4_S4_bRKNS_6localeEjRjRbRKNS_5ctypeIcEERNS_10unique_ptrIcPFvPvEEERPcSM_ -$__ZNSt3__29money_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE8__do_getERS4_S4_bRKNS_6localeEjRjRbRKNS_5ctypeIwEERNS_10unique_ptrIwPFvPvEEERPwSM_ -$__ZNSt3__2L10init_am_pmEv -$__ZNSt3__2L10init_weeksEv -$__ZNSt3__2L11init_monthsEv -$__ZNSt3__2L11init_wam_pmEv -$__ZNSt3__2L11init_wweeksEv -$__ZNSt3__2L12init_wmonthsEv -$__ZNSt3__2L12ucs4_to_utf8EPKjS1_RS1_PhS3_RS3_mNS_12codecvt_modeE -$__ZNSt3__2L12utf8_to_ucs4EPKhS1_RS1_PjS3_RS3_mNS_12codecvt_modeE -$__ZNSt3__2L13utf16_to_utf8EPKtS1_RS1_PhS3_RS3_mNS_12codecvt_modeE -$__ZNSt3__2L13utf8_to_utf16EPKhS1_RS1_PtS3_RS3_mNS_12codecvt_modeE -$__ZNSt3__2L19utf8_to_ucs4_lengthEPKhS1_mmNS_12codecvt_modeE -$__ZNSt3__2L20utf8_to_utf16_lengthEPKhS1_mmNS_12codecvt_modeE -$__ZSt18uncaught_exceptionv -$__ZTv0_n12_NSt3__213basic_istreamIcNS_11char_traitsIcEEED0Ev -$__ZTv0_n12_NSt3__213basic_istreamIcNS_11char_traitsIcEEED1Ev -$__ZTv0_n12_NSt3__213basic_ostreamIcNS_11char_traitsIcEEED0Ev -$__ZTv0_n12_NSt3__213basic_ostreamIcNS_11char_traitsIcEEED1Ev -$__Znwm -$___ctype_get_mb_cur_max -$___cxa_guard_acquire -$___cxa_guard_release -$___dynamic_cast -$___emscripten_stdout_close -$___emscripten_stdout_seek -$___errno_location -$___fflush_unlocked -$___floatscan -$___fwritex -$___get_locale -$___intscan -$___isxdigit_l -$___loc_is_allocated -$___newlocale -$___shgetc -$___shlim -$___stdio_close -$___stdio_read -$___stdio_seek -$___stdio_write -$___strchrnul -$___string_read -$___toread -$___towrite -$___uflow -$___uselocale -$___vfprintf_internal -$___wasi_syscall_ret -$_arg_n -$_copysignl -$_decfloat -$_dispose_chunk -$_do_read -$_emscripten_get_sbrk_ptr -$_fflush -$_fmod -$_fmodl -$_fmt_fp -$_fmt_o -$_fmt_u -$_fmt_x -$_free -$_freelocale -$_frexp -$_fwrite -$_getc -$_getint -$_hexfloat -$_isdigit -$_isspace -$_main -$_malloc -$_mbrtowc -$_mbsnrtowcs -$_mbsrtowcs -$_memchr -$_memcpy -$_memmove -$_memset -$_out -$_pad -$_pop_arg -$_pop_arg_long_double -$_printf_core -$_realloc -$_sbrk -$_scalbn -$_scalbnl -$_scanexp -$_sn_write -$_snprintf -$_sscanf -$_store_int -$_strcmp -$_strlen -$_strtoll_l -$_strtoull_l -$_strtox -$_strtox -$_try_realloc_chunk -$_ungetc -$_vasprintf -$_vfscanf -$_vsnprintf -$_vsscanf -$_wcrtomb -$_wcslen -$_wcsnrtombs -$_wcsrtombs -$_wctomb -$_wmemcpy -$_wmemmove -$_wmemset -$b0 -$dynCall_X -$dynCall_ii -$dynCall_iidiiii -$dynCall_iii -$dynCall_iiii -$dynCall_iiiii -$dynCall_iiiiid -$dynCall_iiiiii -$dynCall_iiiiiid -$dynCall_iiiiiii -$dynCall_iiiiiiii -$dynCall_iiiiiiiii -$dynCall_vi -$dynCall_vii -$dynCall_viii -$dynCall_viiii -$dynCall_viiiii -$dynCall_viiiiii -$globalCtors -$legalstub$dynCall_iiiiij -$legalstub$dynCall_jiji -$legalstub$dynCall_viijii -$stackAlloc -$stackRestore -$stackSave diff --git a/tests/other/metadce/hello_libcxx_fastcomp_O2_EMULATED_FUNCTION_POINTERS.imports b/tests/other/metadce/hello_libcxx_fastcomp_O2_EMULATED_FUNCTION_POINTERS.imports deleted file mode 100644 index e18c75d4e27b9..0000000000000 --- a/tests/other/metadce/hello_libcxx_fastcomp_O2_EMULATED_FUNCTION_POINTERS.imports +++ /dev/null @@ -1,22 +0,0 @@ -Infinity -NaN -___map_file -___syscall91 -___wasi_fd_close -___wasi_fd_read -___wasi_fd_seek -___wasi_fd_write -__table_base -_abort -_emscripten_get_heap_size -_emscripten_memcpy_big -_emscripten_resize_heap -_getenv -_llvm_stackrestore -_llvm_stacksave -_llvm_trap -_strftime_l -abort -memory -setTempRet0 -table diff --git a/tests/other/metadce/hello_libcxx_fastcomp_O2_EMULATED_FUNCTION_POINTERS.sent b/tests/other/metadce/hello_libcxx_fastcomp_O2_EMULATED_FUNCTION_POINTERS.sent deleted file mode 100644 index eb24106ec6d53..0000000000000 --- a/tests/other/metadce/hello_libcxx_fastcomp_O2_EMULATED_FUNCTION_POINTERS.sent +++ /dev/null @@ -1,33 +0,0 @@ -___gxx_personality_v0 -___map_file -___sys_munmap -___syscall91 -___wasi_fd_close -___wasi_fd_read -___wasi_fd_seek -___wasi_fd_write -__addDays -__arraySum -__isLeapYear -__memory_base -__table_base -_abort -_emscripten_get_heap_size -_emscripten_memcpy_big -_emscripten_resize_heap -_fd_close -_fd_read -_fd_seek -_fd_write -_getenv -_llvm_stackrestore -_llvm_stacksave -_llvm_trap -_strftime -_strftime_l -abort -getTempRet0 -memory -setTempRet0 -table -tempDoublePtr diff --git a/tests/test_core.py b/tests/test_core.py index a50704ee4ddc6..c23a47d502444 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -477,16 +477,6 @@ def test_lower_intrinsics(self): def test_bswap64(self): self.do_run_in_out_file_test('tests', 'core', 'test_bswap64') - @no_wasm_backend('uses EMULATED_FUNCTION_POINTERS') - def test_bswap64_emulate_fps(self): - # extra coverages - for emulate_casts in [0, 1]: - for emulate_fps in [0, 1, 2]: - print(emulate_casts, emulate_fps) - self.set_setting('EMULATE_FUNCTION_POINTER_CASTS', emulate_casts) - self.set_setting('EMULATED_FUNCTION_POINTERS', emulate_fps) - self.do_run_in_out_file_test('tests', 'core', 'test_bswap64') - def test_sha1(self): self.do_run(open(path_from_root('tests', 'sha1.c')).read(), 'SHA1=15dd99a1991e0b3826fede3deffc1feba42278e6') @@ -1795,19 +1785,6 @@ def test_bigarray(self): def test_mod_globalstruct(self): self.do_run_in_out_file_test('tests', 'core', 'test_mod_globalstruct') - @no_wasm_backend('long doubles are f128s in wasm backend') - def test_pystruct(self): - def test(): - self.do_run_in_out_file_test('tests', 'test_pystruct') - - test() - - print('relocatable') # this tests recursive global structs => nontrivial postSets for relocation - assert self.get_setting('RELOCATABLE') == self.get_setting('EMULATED_FUNCTION_POINTERS') == 0 - self.set_setting('RELOCATABLE', 1) - self.set_setting('EMULATED_FUNCTION_POINTERS', 1) - test() - def test_sizeof(self): # Has invalid writes between printouts self.set_setting('SAFE_HEAP', 0) @@ -6012,20 +5989,9 @@ def count_relocations(): num_relocs = relocs.count('\n') return relocs, num_relocs - # TODO: wrappers for wasm modules - if not self.get_setting('WASM') and not self.is_wasm_backend(): - print('relocatable') - assert self.get_setting('RELOCATABLE') == self.get_setting('EMULATED_FUNCTION_POINTERS') == 0 - self.set_setting('RELOCATABLE', 1) - self.set_setting('EMULATED_FUNCTION_POINTERS', 1) - test() - self.set_setting('RELOCATABLE', 0) - self.set_setting('EMULATED_FUNCTION_POINTERS', 0) - - if self.is_wasm_backend(): - print('asyncify') # extra coverage - self.emcc_args += ['-s', 'ASYNCIFY=1'] - test() + print('asyncify') # extra coverage + self.emcc_args += ['-s', 'ASYNCIFY=1'] + test() @needs_dlfcn def test_relocatable_void_function(self): @@ -7015,13 +6981,6 @@ def test_add_function(self): self.do_run(open(src).read(), 'Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.', assert_returncode=NON_ZERO) self.assertNotContained('jsCall_', open('src.cpp.o.js').read()) - if not self.get_setting('WASM') and not self.is_wasm_backend(): - # with emulation, we don't need to reserve, except with wasm where - # we still do. - print('- with function pointer emulation') - self.set_setting('EMULATED_FUNCTION_POINTERS', 1) - self.do_run_in_out_file_test('tests', 'interop', 'test_add_function') - def test_getFuncWrapper_sig_alias(self): src = r''' #include diff --git a/tests/test_other.py b/tests/test_other.py index 72cc6cd47baea..f75558ef7b23e 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -806,68 +806,6 @@ def test(args): self.assertGreater(debug_size, unminified_size) self.assertContained('function _malloc', src) - @no_wasm_backend('tests fastcomp extra assertions for function pointer errors - do we need these?') - def test_dangerous_func_cast(self): - src = r''' - #include - typedef void (*voidfunc)(); - int my_func() { - printf("my func\n"); - return 10; - } - int main(int argc, char **argv) { - voidfunc fps[10]; - for (int i = 0; i < 10; i++) - fps[i] = (i == argc) ? (void (*)())my_func : NULL; - fps[2 * (argc-1) + 1](); - return 0; - } - ''' - create_test_file('src.c', src) - - def test(args, expected, assert_returncode): - print(args, expected) - self.run_process([EMCC, 'src.c'] + args, stderr=PIPE) - self.assertContained(expected, self.run_js('a.out.js', assert_returncode=assert_returncode)) - if self.is_wasm_backend(): - return - print('in asm.js') - self.run_process([EMCC, 'src.c', '-s', 'WASM=0'] + args, stderr=PIPE) - self.assertContained(expected, self.run_js('a.out.js', assert_returncode=assert_returncode)) - # TODO: emulation function support in wasm is imperfect - print('with emulated function pointers in asm.js') - self.run_process([EMCC, '-s', 'WASM=0', 'src.c', '-s', 'ASSERTIONS=1'] + args + ['-s', 'EMULATED_FUNCTION_POINTERS=1'], stderr=PIPE) - out = self.run_js('a.out.js', assert_returncode=assert_returncode) - self.assertContained(expected, out) - - # fastcomp. all asm, so it can't just work with wrong sigs. but, - # ASSERTIONS=2 gives much better info to debug - # Case 1: No useful info, but does mention ASSERTIONS - test(['-O1'], 'ASSERTIONS', NON_ZERO) - # Case 2: Some useful text - test(['-O1', '-s', 'ASSERTIONS=1'], [ - 'Invalid function pointer', - "called with signature 'v'. Perhaps this is an invalid value", - 'Build with ASSERTIONS=2 for more info' - ], NON_ZERO) - # Case 3: actually useful identity of the bad pointer, with comparisons to - # what it would be in other types/tables - test(['-O1', '-s', 'ASSERTIONS=2'], [ - 'Invalid function pointer', - "called with signature 'v'. Perhaps this is an invalid value", - 'This pointer might make sense in another type signature:', - 'Invalid function pointer', - "called with signature 'v'. Perhaps this is an invalid value", - "i: asm['_my_func']" - ], NON_ZERO) - # Case 4: emulate so it works - test(['-O1', '-s', 'EMULATE_FUNCTION_POINTER_CASTS=1'], 'my func\n', 0) - - @no_wasm_backend('uses EMULATED_FUNCTION_POINTERS') - def test_emulate_function_pointer_casts_assertions_2(self): - # check empty tables work with assertions 2 in this mode (#6554) - self.run_process([EMCC, path_from_root('tests', 'hello_world.c'), '-s', 'EMULATED_FUNCTION_POINTERS=1', '-s', 'ASSERTIONS=2']) - def test_wl_linkflags(self): # Test path -L and -l via -Wl, arguments and -Wl, response files create_test_file('main.cpp', ''' @@ -3970,43 +3908,40 @@ def test_bad_function_pointer_cast(self): for opts in [0, 1, 2]: for safe in [0, 1]: for emulate_casts in [0, 1]: - for emulate_fps in [0, 1]: - for relocatable in [0, 1]: - for wasm in [0, 1]: - if self.is_wasm_backend() and (not wasm or emulate_fps): - continue - cmd = [EMCC, 'src.cpp', '-O' + str(opts)] - if not wasm: - cmd += ['-s', 'WASM=0'] - if safe: - cmd += ['-s', 'SAFE_HEAP'] - if emulate_casts: - cmd += ['-s', 'EMULATE_FUNCTION_POINTER_CASTS'] - if emulate_fps: - cmd += ['-s', 'EMULATED_FUNCTION_POINTERS'] - if relocatable: - cmd += ['-s', 'RELOCATABLE'] # disables asm-optimized safe heap - print(cmd) - self.run_process(cmd) - returncode = 0 if emulate_casts else NON_ZERO - output = self.run_js('a.out.js', assert_returncode=returncode) - if emulate_casts: - # success! - self.assertContained('Hello, world.', output) + for relocatable in [0, 1]: + for wasm in [0, 1]: + if self.is_wasm_backend() and not wasm: + continue + cmd = [EMCC, 'src.cpp', '-O' + str(opts)] + if not wasm: + cmd += ['-s', 'WASM=0'] + if safe: + cmd += ['-s', 'SAFE_HEAP'] + if emulate_casts: + cmd += ['-s', 'EMULATE_FUNCTION_POINTER_CASTS'] + if relocatable: + cmd += ['-s', 'RELOCATABLE'] # disables asm-optimized safe heap + print(cmd) + self.run_process(cmd) + returncode = 0 if emulate_casts else NON_ZERO + output = self.run_js('a.out.js', assert_returncode=returncode) + if emulate_casts: + # success! + self.assertContained('Hello, world.', output) + else: + # otherwise, the error depends on the mode we are in + if self.is_wasm_backend() or (wasm and relocatable): + # wasm trap raised by the vm + self.assertContained('function signature mismatch', output) + elif opts == 0 and safe and not wasm: + # non-wasm safe mode checks asm.js function table masks + self.assertContained('Function table mask error', output) + elif opts == 0: + # informative error message (assertions are enabled in -O0) + self.assertContained('Invalid function pointer', output) else: - # otherwise, the error depends on the mode we are in - if self.is_wasm_backend() or (wasm and (relocatable or emulate_fps)): - # wasm trap raised by the vm - self.assertContained('function signature mismatch', output) - elif opts == 0 and safe and not wasm: - # non-wasm safe mode checks asm.js function table masks - self.assertContained('Function table mask error', output) - elif opts == 0: - # informative error message (assertions are enabled in -O0) - self.assertContained('Invalid function pointer', output) - else: - # non-informative error - self.assertContained(('abort(', 'exception'), output) + # non-informative error + self.assertContained(('abort(', 'exception'), output) @no_wasm_backend('asm.js function table feature') def test_aliased_func_pointers(self): @@ -5825,85 +5760,6 @@ def test_libcxx_minimal(self): # we can strip out almost all of libcxx when just using vector self.assertLess(2.25 * vector, iostream) - @no_wasm_backend('relies on EMULATED_FUNCTION_POINTERS') - def test_emulated_function_pointers(self): - create_test_file('src.c', r''' - #include - typedef void (*fp)(); - int main(int argc, char **argv) { - volatile fp f = 0; - EM_ASM({ - if (typeof FUNCTION_TABLE_v !== 'undefined') { - out('function table: ' + FUNCTION_TABLE_v); - } else { - out('no visible function tables'); - } - }); - if (f) f(); - return 0; - } - ''') - - def test(args, expected): - print(args, expected) - self.run_process([EMCC, 'src.c', '-s', 'WASM=0'] + args, stderr=PIPE) - self.assertContained(expected, self.run_js('a.out.js')) - - for opts in [0, 1, 2, 3]: - test(['-O' + str(opts)], 'no visible function tables') - test(['-O' + str(opts), '-s', 'EMULATED_FUNCTION_POINTERS=1'], 'function table: ') - - @no_wasm_backend('relies on EMULATED_FUNCTION_POINTERS') - def test_emulated_function_pointers_2(self): - create_test_file('src.c', r''' - #include - typedef void (*fp)(); - static void one() { EM_ASM( out('one') ); } - static void two() { EM_ASM( out('two') ); } - void test() { - volatile fp f = one; - f(); - f = two; - f(); - } - int main(int argc, char **argv) { - test(); - // swap them! - EM_ASM_INT({ - var one = $0; - var two = $1; - if (typeof FUNCTION_TABLE_v === 'undefined') { - out('no'); - return; - } - var temp = FUNCTION_TABLE_v[one]; - FUNCTION_TABLE_v[one] = FUNCTION_TABLE_v[two]; - FUNCTION_TABLE_v[two] = temp; - }, (int)&one, (int)&two); - test(); - return 0; - } - ''') - - flipped = 'one\ntwo\ntwo\none\n' - unchanged = 'one\ntwo\none\ntwo\n' - no_table = 'one\ntwo\nno\none\ntwo\n' - - def test(args, expected): - print(args, expected.replace('\n', ' ')) - self.run_process([EMCC, 'src.c', '-s', 'WASM=0'] + args) - self.assertContained(expected, self.run_js('a.out.js')) - - for opts in [0, 1, 2]: - test(['-O' + str(opts)], no_table) - test(['-O' + str(opts), '-s', 'EMULATED_FUNCTION_POINTERS=1'], flipped) - test(['-O' + str(opts), '-s', 'EMULATED_FUNCTION_POINTERS=2'], flipped) - test(['-O' + str(opts), '-s', 'EMULATED_FUNCTION_POINTERS=1', '-s', 'RELOCATABLE=1'], flipped) - test(['-O' + str(opts), '-s', 'EMULATED_FUNCTION_POINTERS=2', '-s', 'RELOCATABLE=1'], unchanged) # with both of those, we optimize and you cannot flip them - test(['-O' + str(opts), '-s', 'MAIN_MODULE=1'], unchanged) # default for modules is optimized - test(['-O' + str(opts), '-s', 'MAIN_MODULE=1', '-s', 'EMULATED_FUNCTION_POINTERS=2'], unchanged) - test(['-O' + str(opts), '-s', 'MAIN_MODULE=1', '-s', 'EMULATED_FUNCTION_POINTERS=1'], flipped) # but you can disable that - def test_minimal_dynamic(self): def run(wasm): print('wasm?', wasm) @@ -7815,8 +7671,6 @@ def test_metadce_cxx(self, *args): @parameterized({ 'normal': (['-O2'], ['abort'], ['waka'], 186423), - 'emulated_function_pointers': - (['-O2', '-s', 'EMULATED_FUNCTION_POINTERS=1'], ['abort'], ['waka'], 188310), }) @no_wasm_backend() def test_metadce_cxx_fastcomp(self, *args): diff --git a/tools/building.py b/tools/building.py index b9acbbf6fd01c..86c2a31268a00 100644 --- a/tools/building.py +++ b/tools/building.py @@ -895,11 +895,6 @@ def is_wasm_only(): if Settings.RUNNING_JS_OPTS: # if the JS optimizer runs, it must run on valid asm.js return False - if Settings.RELOCATABLE and Settings.EMULATED_FUNCTION_POINTERS: - # FIXME(https://github.com/emscripten-core/emscripten/issues/5370) - # emulation function pointers work properly, but calling between - # modules as wasm-only needs more work - return False return True diff --git a/tools/shared.py b/tools/shared.py index cb1518d10cb4c..d57dd7074655f 100644 --- a/tools/shared.py +++ b/tools/shared.py @@ -1103,9 +1103,6 @@ def verify_settings(): if Settings.CYBERDWARF: exit_with_error('emcc: CYBERDWARF is not supported by the LLVM wasm backend') - if Settings.EMULATED_FUNCTION_POINTERS: - exit_with_error('emcc: EMULATED_FUNCTION_POINTERS is not meaningful with the wasm backend.') - def print_compiler_stage(cmd): """Emulate the '-v' of clang/gcc by printing the name of the sub-command From 0f237728c9f3167fc7e93e4923c183308d3c2728 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 11 Aug 2020 14:48:17 -0700 Subject: [PATCH 2/2] remove unneeded code --- tests/test_core.py | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/tests/test_core.py b/tests/test_core.py index c23a47d502444..209dd7c4dc325 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -5976,19 +5976,6 @@ def test(): test() - def count_relocations(): - generated = open('src.cpp.o.js').read() - generated = re.sub(r'\n+[ \n]*\n+', '\n', generated) - start = '\nfunction __apply_relocations() {' - relocs_start = generated.find(start) - if relocs_start == -1: - return "", 0 - relocs_start += len(start) - relocs_end = generated.find('\n}', relocs_start) - relocs = generated[relocs_start:relocs_end] - num_relocs = relocs.count('\n') - return relocs, num_relocs - print('asyncify') # extra coverage self.emcc_args += ['-s', 'ASYNCIFY=1'] test()